From 4e5a9e958f6cccaa6586c9acd5da5df1629bacb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iris=20Marie=20K=C3=B6ster?= Date: Wed, 13 Sep 2023 12:21:06 +0000 Subject: [PATCH] make export tests run MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Iris Marie Köster --- cimpy/cgmes_v3_0_0/Base.py | 37 +++++++++++++++++++++++++++++++ cimpy/cimexport.py | 17 +++++++++----- tests/CIM_v3_import_reference.p1 | Bin 317636 -> 317582 bytes tests/test_export_v3.py | 6 +++-- 4 files changed, 53 insertions(+), 7 deletions(-) diff --git a/cimpy/cgmes_v3_0_0/Base.py b/cimpy/cgmes_v3_0_0/Base.py index aeeffc2a..f7da68c9 100644 --- a/cimpy/cgmes_v3_0_0/Base.py +++ b/cimpy/cgmes_v3_0_0/Base.py @@ -13,6 +13,43 @@ "EquipmentBoundary": 'EQBD' } +long_profile_name = { + "EQ": "Equipment", + "SSH": "SteadyStateHypothesis", + "TP": "Topology", + "SV": "StateVariables", + "DY": "Dynamics", + "GL": "GeographicalLocation", + "DL": "DiagramLayout", + "OP": "Operation", + "SC": "ShortCircuit", + "EQBD": "EquipmentBoundary" +} + + +class Profile (Enum): + """ Enum containing all CGMES profiles and their export priority. + """ + EQ = 0 + SSH = 1 + TP = 2 + SV = 3 + DY = 4 + GL = 5 + DL = 6 + OP = 7 + SC = 8 + EQBD = 9 + + def long_name(self): + """Testdocumentation + """ + return long_profile_name[self.name] + + @classmethod + def from_long_name(cls, long_name): + return cls[short_profile_name[long_name]] + class Base(): """ diff --git a/cimpy/cimexport.py b/cimpy/cimexport.py index ce0802b7..d48754e8 100644 --- a/cimpy/cimexport.py +++ b/cimpy/cimexport.py @@ -3,11 +3,8 @@ import chevron from datetime import datetime from time import time -from cimpy.cgmes_v2_4_15.Base import Profile import logging import sys -from cimpy.cgmes_v2_4_15.Base import Base -cgmesProfile = Base.cgmesProfile from pathlib import Path import copy @@ -164,7 +161,7 @@ def _create_namespaces_list(namespaces_dict): # possibleProfileList dictionary the possible origins of the class/attributes is stored. All profiles have a different # priority which is stored in the enum cgmesProfile. As default the smallest entry in the dictionary is used to # determine the profile for the class/attributes. -def _sort_classes_to_profile(class_attributes_list, activeProfileList): +def _sort_classes_to_profile(class_attributes_list, activeProfileList, version): export_dict = {} export_about_dict = {} @@ -180,6 +177,11 @@ def _sort_classes_to_profile(class_attributes_list, activeProfileList): class_serializationProfile = '' + if version == 'cgmes_v3_0_0': + from cimpy.cgmes_v3_0_0.Base import Profile + else: + from cimpy.cgmes_v2_4_15.Base import Profile + if 'class' in serializationProfile.keys(): # class was imported if Profile[serializationProfile['class']] in activeProfileList: @@ -314,6 +316,11 @@ def cim_export(import_result, file_name, version, activeProfileList): t0 = time() logger.info('Start export procedure.') + if version == 'cgmes_v3_0_0': + from cimpy.cgmes_v3_0_0.Base import Profile + else: + from cimpy.cgmes_v2_4_15.Base import Profile + profile_list = list(map(lambda a: Profile[a], activeProfileList)) # iterate over all profiles @@ -359,7 +366,7 @@ def generate_xml(cim_data, version, model_name, profile, available_profiles): # the class definition and the attribute definitions are in the same profile. Every entry in about_dict generates # a rdf:about in another profile export_dict, about_dict = _sort_classes_to_profile( - class_attributes_list, available_profiles) + class_attributes_list, available_profiles, version) namespaces_list = _create_namespaces_list( cim_data['meta_info']['namespaces']) diff --git a/tests/CIM_v3_import_reference.p1 b/tests/CIM_v3_import_reference.p1 index ba4e82d09e83234f9fe97b8b2b136a5adadf028a..3f3ff0091e43505bc01154c1631fef2295ca502f 100644 GIT binary patch delta 25797 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 delta 25546 zcmbW9cR&=^_Q##sQCU!dr=nm16cB8%u|%RqiCq-2i;A+q3cCVJRWUY<2^JIx$hAa; znAoMn=wgYAF;TISXCoTRGl^Z`8S}IIJNMoJcXjSCFZp9mf0Zs$2+sEOuj?=PbN==Gd4IDSzPjdZxk{I26Rt}Li`T~{>Wwkk zm=NCDW#w>Po7w2n)CrNs_{0Ehw2lxw_Lg;%bEz+?XIb$coI1;!52`6i=Uq9QtRj96 ze0EkDIP0v{s#cu!E|V(kCFiia1@|blnniYDoU^N18`&W^+h46sGPqjRsWUg*Gt!2J z!_mf}z%XunYa3mpH(+(NNs-+on1f+lGtLHG4C4lJ)}~hB+y^S>hjw-97@pvdzwyV! zhVbze-<`xCR;HK;ZUJ8_)zHAD)K2Y;QbG+kD)IOrPKj1pq7tg(OeG#qCM(gJK1T^< zGhYd{Jw*xSzeovn{|hB;T)ISwR{Jz1ROt#O9`%_@wA9&3sI56lJPuy1gu1;}iO1CS zN~m^uN~mKSl~56zlu-4z0@b0GxouykPErD1CIZvkP*DfL({yD!XQ#3;GedvpbMBlq zYFWU!a3f5;3%DUF^@t{Q>O=}@?o*N7F3!Wc9xOz2vm@1p(J198=ke}Zp#|Cyia)TO zA;Ki=;-YwN1d7|ueaI=ad9<6_Oe$7xbGaC7%z{0${~rWEhfO}fN64Y1aw)r-=_L?lMSW{x*fLrVv<{kD!j0IJY1u{KQ= zQGIJ@3mh>qxS@TQxc1GgwP`|x53PrLKHdjQTB8@2I9D57FpCzL+Fj<(b6iXGvK+d= z1=&||9!<#{>^&OJpa->)`yNouj7PPRstQV$SJp-jtD@f9KCX?-dCZ0LT)yeW6YdV*th8C3I$E8bBB4+<$Ze4A(+U6SD*JPXu3Pr&1iF3oyC zT#`OES{IX;0HJx}hY;YZK*WMGRDor6eVXuzHu)`{W<5G7G$9cW4Ek&Z8py5z?*yJZ zG~gXM8`FRWd?LqHp?wYc54k7E&yja>dWi#lg+Fjq2Hp`quwO$xlSd*%+GfU^Z+5k}tgxx2z4y}h?LF9;fgIJ0 z4FtBHrk|VfpWsxf9Tl}b$r1bme&0zEKE4ITPq$Qr`?jKZL2E^L3ulUFx+ub5xd3j~ zZ-qO}x0Kp*f4vP16Epj~F1*>6MD3O49&Fp0p1AS-a58;86vh9o2X1bLsf8!slH&X|E%=lC-R`;-;rPNFFeg^CLVbMfqv`AJ2!%V_8pq|JZT-P)&AUN13{-azg%%H%f&Lmyp_xNvpj$&JG;Np+^vf^`jSY~2N&+auQ$pA~o!Y^~Ujr=HzUQD{6)S-r)_&Xz@50TW|sy$G1V($MH6B ze}5eB0+$BkVLnqWsCi0!cFIC&XYEE~cTqg*BbTh6ES{KYWM={NK>u{+} z09#lp+xG9*&lod97oVt$9~+}jqz9L@demXfj-J+VoG~g<8=)Jfo1u%UiNiE~GC!2- z_456I`}Z5BkI`Wex9kxB!Q$Z{t!{Mdx){#Yn&`EF-G*FfLkw@B{pS-FcnQBEJJz(^0Y>nkO@ ztFKfX%l)KEBR-KT_3I~9+M>Ty>689aeUv{yiX}Zaz67%UdZ1LJLI+7%^%^Wy>M%sA z6tZ2~L@K4|Y`V$^y&fv*)?Z4h*D$G4hv8DCm6D~U0m9<M)HS2Qo(_sL>RQc%c1Zg7^CakfdX9xKyUjhfDc` z9+HT7@ieK@&C!*Q1D9%doL4#t10RS$K5k71z zC3Go<2#qwdg|Y&tYS1~OS$x;yYm0AcERijbm60t^(4Yx%B#rCh7~$QHBRbl6M*a49 zA-N`PE$`MAmN9|I-A!PJg3ewfJ+sy~YerOaZ~pM?6FM6F*~TcXmFiJW@2Ok6`dL0qY` zNnEGpzzyF*M*Tk}VCJWc0Iz&XJdT~isNXP$)H}{)N0epTLW5S#B|Y++42O#LLO_$| zk%02%F&y5XM;z+rGwKWGlX|ZOjQWHHr2Zk)v${6xs=Wq9rI3J&QW!cfQix8{LPq_e zg{0p1GZ{Y}12w4lGveo!42K@tLYIEJh$NiLYU*47bxugVIt7S0=~x9i%~li_KQ7x$rJcenq{$n1mU$gzX-^d=BI0(h`!M zR!e0-ZXoZ2)-EOBO#mgA-VV#m@)#0XTYwdSLmu^M47putq`uQ~c3fH7Tn*Z>oaC=c zhC{ATprOVU!ho73;(N1#_)kuk@&9U$20cwD{(EOI+L4+;bhu1Ly?-XD|A|#^ z`z5Jg@}*21`5iRKDvQK1JWGbVu|k7RQO-VFhD&L#K^fVgXG9mWgnTLP7BcXfa`fcAHWK?i(XxJ9TAYly#tXDCB z(W@v>!2)`$7S`0qa`?z{wpcKmU{VfSt)Y5**DxINYbmgPEd#i{R+x!H4*7}!Z2gKV z3|PkiR;;5y`}GVUVLb(GH!uKbg*QswAWW}mdC|$*THZUCik9axMBC(1;9wpDsQ4w-M$gla>9M+Yw{wxu7TV(>c;!1;1+fE=DYB4joSool}QzT?M$gGc)?5{JN(KS zSK>Fs?V^jJal|QdF)PWae@ahWgUZS2`1z$WW zW^5I_c!)J`tFVa^yxqXjshto6zC%U6_-!`14e5`4c)OuH+l8A=8$hl3yXHt=Lt{77 zwH-np$B%MDDftleD6EhYh|Qqrem>LeW`U5)2?+!b!FYljDlQVb@Nj)tB;0h7^k)8@ zPv!}gr^#WL5X}kMAd~enAHpVgJNJTKwi~MW9`xYqwwoD-(;f(eH@Tq$CSc)O1y{jD z!ivOsAh&1h;RvBNqnJ`Z6*Cq0@5TAJ=7y&12c>IR>CrfB4n@bI2v@z@ub_chajBjr zj~{URICoHa+83*E?x^%2sKE7&cVz?C~fuicL@Z94vldu9N3 z>30NwIf8Gq_U!`a1Kd%MpO}W7f5y(HxubK(pykuBz~vn(FoU9xjx)`CPC&whRE+;R z1N$SleR|>6rn;lvCxtEzaS{3ALwq6Ej#O5bMiqieiz=dcZ>%*-&p=D`RIAXy0G=5raA!IL&_q$d zC7J=~qbV>Uh5_WoP$0v|0Jv0W&(!*mo8_sz7PsekECaQVBU(A}jQSz*)K`xL29T0K zf!IU_us4wcTap++RT2em%wPcatE!u`dnRp8^H~g3JBw-sCNqH5$rM;Tn*o%~roiD( z8Gw2Y1)k1f0Df~R;4_Z_B+sKjllF7dI~h(zyP!xC=i&-09NNx zU~wJ;D9fY3;jbBhdLsp%Ze##{-%!BkTL$2|wR(uu-9(2-|C(wI|h35JF0bV7X#p4g4TQ<_T+EBr#)r0n}LqpO||;&VE{|^ zP+*pc0hE|1P*}_Wo)uHz&Rzzf*+&7F{R}|Ap8^vOFo3)R6v+620gzM5lziSBUF$~2 z+wp@8)cz3B$~nxaA99%b>QTY~Qc5TgdxQb(JwkykKQe%-A1QF-C& z9IsHo>M8?(Gb2&x`x^sT@*4$aU1IK+Ad+-Cq@4=B+5Ap_7pq(I;!2C(`O1r}E@fU*h-9Ij*l>M9C6 ztzrOv|D}M>V+N4?m;#Z1F@U1KD3JSv0o;8;fy;k00N4McfZbCD5cHG+gP$>g%x4r> z@SFjhcus-h7YqRQeKH;@UorsSR}}Dk%>d$FQy}CG1K4I=y^QQ!$os5}Awzs+o=Wl! z4m_xlc*;5Hdi1LUsKG&n>^=4>1_kGxVAQ99+0kf-z(8RKAa7TQU`kyE1?wt_Yi~UU z0NVgrEQw52eFg>ZhKP)pngPJLgqKHZ+B~f_gMyS2nbkH706K-VpF~sEfI&Gmq%!J8 z3;>QD@J!T*M&oD8pqAQFnPfXvcV~&Wa`*=~)jwK9=`-P%R)5>6_TsZckv&5ao=t+$ zo2Jz9-G4DCSkQw}dSgntHepaONysso2dPJ#|$10 zT5p#|t}lZc+Ls3B>!&pPd;Dnj<33?X?)!vFZtceaV44P_5&da0I-n+BijHPSY7~wx)(rY%11DO_E8`+Kak4Uk7Q7gOuAx?s=a;4IUQ!<&!gx# zNEywLEFDcH_l{uz{8$Q9jb#8IjiZ3qcm}X-0<`Vyc-2z-m18fHFGk7V=kNwtaI_QH zMx?2$gA_ECY=aIHX;aH4G9=-EK_u0a831%P9JVIYPVft6P)mcUO!5>3k&#aLdkT%L zXevYU`BW--H-rHgLLstrEse}IlueNa28A&In60peg;ANza0Ue{9g#VqV*s#rz@jyc z%5V`33f5gB;~U8UV79^$E0W5@=@}GkdqifdfdRk<01MT0DsywXG-ZMb=FRmXUvS$P z6hT*uY5?g_$wcLU;WiL{Rxjp7t^X})k2Q<=z>}rRo$Dn?^5&qcQpZD zg8Otq2BYdfd?ybS5Uc7rpNQ7)uh&MzYoo<4-R*{iLj?M1dR_R4P=hWkQ7mV~k!BTd zG>_LZu1*jsKHbCrBg?;@*5CnAk-M}8;qls;CaXBrj~tHXbUeg7`Q4bYwIRHVsYQZn zB*9`5<*);ZswSKo8_~bY>o5b34{wrGYPPb=3`-Mu0P%3G`C&dYphYuP?MOg7XUPTh zVwMu-wuN_6H^2nxudWp zY*5F;^u|g#taFZK_dhIGl=m+YbQe}HTqURedeuAX%M_`Ht`TEjwpLEPe63{yC#{1y z?!8WK?gXy0?D)=JU~+D~oJrMs%Ql4MD(a@Oxneg>&y#Dz-aN}T^xOym*>02z$Y-ON zouF^zlsA7PEZgO=(o4#SA9I3zcs z?GB60^DU86PAw4wSa(DYyMIL0hRhG!qjFgAQOmBF(g@Lk=f73EqD8dA&T~e4@#l=X1xnzUIN0eFi!@*w^sqgy5GBZBs6`8r87n|Jkf?QBbE{MZ!=S4Z}#YJ)T zcDgKwMP7yk;zd5QTn@WlZaK7;U4cP7^@`jeUU0=Sc@VQ@l@XjE^IB*fCs@4i>2wZ`-#2(c=6w&R5-c8# zm)}v;A72YXTl4J=Ug|2@W1H540C77y)R${Va(xI2W2da-FekN$MO({Z`>jQ%Wj1n{ za|6NR*zoa3FcD)L$|Wzep+&xPY!xNpNh8aY=h-PT%dr!ivBO@j8PDy-qzrE?hplZa zVvm~0VZE9P^a*~VgB-TS0dhw=teG6<)LftsZoZCkSgNBK+pkV?m}d(S`?RGTcA_OX zH9Lv