From 6da10a4d08d0e475a4499db17e47ec2417614b1c Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Thu, 28 Mar 2024 18:35:34 -0400 Subject: [PATCH 01/45] Initialise documentation with Github Pages and Sphinx --- .github/workflows/sphinx.yml | 24 + docs/.gitignore | 1 + docs/Makefile | 20 + docs/_static/favicon.ico | Bin 0 -> 850 bytes docs/_static/user_auth.png | Bin 0 -> 126550 bytes docs/_static/user_include_passed_na_etc.png | Bin 0 -> 3485 bytes docs/_static/user_results_icons.png | Bin 0 -> 12038 bytes docs/conf.py | 31 ++ docs/dev/functional_parts.md | 35 ++ docs/dev/gherkin_deep_dive.md | 9 + docs/dev/ifc_gherkin_rules_readme.md | 61 +++ docs/dev/index.md | 21 + docs/dev/rule_details.md | 489 ++++++++++++++++++++ docs/dev/validate_readme.md | 158 +++++++ docs/index.md | 7 + docs/ref/index.md | 1 + docs/requirements.txt | 3 + docs/user/index.md | 17 + docs/user/using.md | 45 ++ docs/user/validation_overview.md | 54 +++ 20 files changed, 976 insertions(+) create mode 100644 .github/workflows/sphinx.yml create mode 100644 docs/.gitignore create mode 100644 docs/Makefile create mode 100644 docs/_static/favicon.ico create mode 100644 docs/_static/user_auth.png create mode 100644 docs/_static/user_include_passed_na_etc.png create mode 100644 docs/_static/user_results_icons.png create mode 100644 docs/conf.py create mode 100644 docs/dev/functional_parts.md create mode 100644 docs/dev/gherkin_deep_dive.md create mode 100644 docs/dev/ifc_gherkin_rules_readme.md create mode 100644 docs/dev/index.md create mode 100644 docs/dev/rule_details.md create mode 100644 docs/dev/validate_readme.md create mode 100644 docs/index.md create mode 100644 docs/ref/index.md create mode 100644 docs/requirements.txt create mode 100644 docs/user/index.md create mode 100644 docs/user/using.md create mode 100644 docs/user/validation_overview.md diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml new file mode 100644 index 00000000..1e63e921 --- /dev/null +++ b/.github/workflows/sphinx.yml @@ -0,0 +1,24 @@ +name: "Sphinx: Render docs" + +on: push + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + - name: Build HTML + uses: ammaraskar/sphinx-action@master + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: html-docs + path: docs/build/html/ + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + if: github.ref == 'refs/heads/main' + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: docs/build/html \ No newline at end of file diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 00000000..c6a151b3 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1 @@ +_build/ \ No newline at end of file diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..d4bb2cbb --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..635011ff5cca540196cbabeb603f4ce210c8f9e1 GIT binary patch literal 850 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy_X2!ET-^(N82#ok%v}#eb4|Lg z@`vqIE_}k^Dib{)C~}L<8^~sCT{YjNYo19LgWo(>-+2tP)&m(Ve)E7L3yeB|%76@@ zGLPIj4B1P7QXrLc*8@d>3}#;t_db(5Lgs)36GHLBDtSge=M5%zGf_%eqVkDp;>n03;hdCguj#91;xKDiH;gW$>TR zFmJtK%8g_Y0JH=p=ar+h!i zcty+XdHwI6M@-1e?Ad+x%(a(Y4PWc#){8A`sA`&%Xfiu~N=SD>e}~8M3q1E37#Qz* zx;TbZ+)ADFGU}0ofU7r$XS!j7fZ0S@M%f9zA|-$Bw58np-@5Gm+ZxHEzqMBu@3M-O zJsGrX#~e)?5v#tIKH!Jh<(m0nJTU9u`<{SJt_1S8k#5taTNWBg2X*?|2U0y1i)|@auwkT%zS@uW0 z8dJ`6{O&v_D93^rU%>K^A^ZBR~_$q_-o%c-v4@R@ssy+ z1g~n2-m~7eGVg7}ey-wti~L0u2iSHlJ=}j%yTF>|zT`gdFyHcjp8p;ktNft#B~ao_xk zo?Cy`^4s}X_NtiX^nElF&|EyzdYVaWU(n6Oud~{W_UL@NdqJ7Im(lLeAxphydwiMy zcV1n2X$lw~>-64cr@}Bpc zpT0lfTkGChYi3sUbno3&ySlpS>DrMhO41mp#HerHyupx_kyLy01}^8#n|IjAh_5Y7 zbv5m;KW|;tq{ZJc>aeVcj8%YR^l2bGkShR@@pj)RcnAun z@Mrv_0ZtFx5Rp$_v?O0F69x;zJ1o7+I*(K+)ARs{W2;%9K z@;n|UCT3h5e`o2n7l|Ym1XNB{NRt&)K$|H_pveG`>YA1;(`y0WN7=F*G0w`*5i?_} zHn-Y_{+dVk^U$xE!v<*>TFN=Dx z-P+u|WDlgxA$JM}v(KUO1kWdjaE5)Kzy-I@5bkix!j(g_bhws_t5>DVj5PpHn zal|?=x6)@3d}DrA{IPk}No9g4rAJ7RKK>~!ic$^j>Q%czQTJFQ#JQh+eSO9Q)QL^;T%vZ*z+0i#pm zr2({!OOHsW-d9X3WvhE^!Ih!hZ-?G-bN5$zx}_zW0Hp-ND>_15W0pN7c8P=-h=6dZd4f^v+NpT`kp#A+oAbB98L!nVjq2**gt z$kr;_U)7o-EvQ;qDSmdRpIWIgBp}H5dVloqnS{~iP`H-*yP3}bl)0hH z5CQG-ZI}WIK{38ct-tMW%ry%TVr*mlrytpF`BN0g3>nxwwxB zDm_9t)3}viu=uytrCBlDiffxiqAi4M+$^!d8dcIZXniIMW03 zeRSN{(+@wF_;_x|xvMp}aOyO+8Mex%CjdO9{$%v%DzYMr$)@i}NE?}bO$1Ih>&)}6 zYM$~cyb8#$C!}y}vB0K2gT#2=29N1@x z2u(zB1*-I^R-Kv);>Tb@#$x= z7Nc>;C?&J$mM(5yiQz2OBQ~(+{NPBKc$rA@pVR}1`IP5ubj&qQ4)OuwLUOiaV1H>& zAHT;A!Ge)3N;!e$7~XnlLdEXWu6P1SEz`(Hajzl-0hBWlrnGx*=oN*aE5%h69u#&m zw84|G=1REs8qohZh|Q4_X*QM-3W!SiDNZ_*HgT&U1u2M=+qjvvwG=vTwWYJ3$a7T& zo&M?tD^eV@%Od$>(r25=e4s6f2s>DBsU(*tj14L8=he+^x|`u4|Ea0Uv|tV18sVQ_ zftr(z+!`AZa&R&KVx`MO%2zrK1l*<)=^7#I*bl}rt zFhYV7$=j@&<%r_qS?PB5;SwAVY)PHB;ziN?UgcInN1@}^z<}HS1;9Vkdn@>O!&ZB0 z)@Q|R!Y4%@Kde?1n;sgL^_wVK%Hd}Qv6fIvS+Di%2{TXqe1x2I*CXvP_+horEOP4< z9=Ca2ox*G?6=F$X3l?rlFJ;UW6~r$<%ZjU@zi+;plo#bhczI&@Cmnmpt8~#S!Ngn% zCh8*;05yO1TCG%Bv`eqqV(hs$Xw|2UdtB5tJ#?`W)@RbfLc(y?w7GdGnzbnn^Y&Cd z?Rgl|TbVtTUs3%(4gF}RY+yV?(Ttfg{?7*Y?p1_Vn##7FI0&q?ZjN6mV~O&8-oD2- z?3(W*HxGQ9sBd=_Nz&cqRaV)}fXUy(UQN&IndbSk6yaiOM&4o>5nfrH{Xf+H`CiK*MywR2$|{whoNTRVfIy0WWJNzxcq zhgBxK-Q3^5o7_Hl0V#7$vQ+*|p$DqB6I{;DX}_u&^YuorV-`Z1(x06{ydFsjNqXu$ z?H;!m4}_pnRFgj&5cRY51+0HP?fMdx;{vcu^li1(J#dU(eg59(TT$&2cw-U4S6U~^ z_Vf8Cz&~1L^SU~GRqubux$kv*d-cx$p&^Xm*BkyX@uL5KgZ`t7|G!rRH2pALs}vIp zrDg%GErn!1dZt@HKu{Rh+VGFCgyaigcZ-2_{8y0%6BBE7V4Rhafo$Lw*{amKCNUgu z)sH`T%E(U*NgREkH@}R>x+Z^6{}3q;g8$z7D`MO)??UIOwH;8$!Q9}f-YoHZ!8Sfc zjm+d`MI9?WJ3Zyu%L!}GE`%t5P)<9p2oVo4@})vwTFSv z@f669iIFFMTu8(W@JQCZ=L8WxYOETb2DBW0c64)C_>YwEpQfjf;X?!ZtDj4rq?4W6 zRoU72{5N(JL`C`VR&rsjH-FWy#3wRR03laiBRgSZm_QLXs%lk&W@a{rty?Aq9#vbIkF0NXcqeNo zqcGaTDz55aOvx^Joe>-p?fkHZ>Vhv-oow$+Y<5CH+2X-Z_?!~p`3lURHApE4cQ479 zZzCb#v!^aY0~dh6%9?_YKPJ@`NIVv@45%RPRuw61 zL2^JotyNjfEm_8V!keVQQXEk1)-VqZAL8!0S}}iw#Je@KOy+sp5Ci4`()~fUJwBft zM&~}eM`-_P_#&yp3S9I4REjk1hOPKy*JOq=3z)N*bH><7Dp$OU28#-l>=F|vBW7@0 zVlyLrPRFtS6*k}ph{G$(1-8i);^2~xW}BDsI%6IEj)FgQosLfxwQA(|8>tiGWykqE-Rjv!vFNZBj6@0D#`$>s{Bs zL97a$JTgd!Zwv|});=x_O;IR#a=Gom7!P_9BO8-SvY?vF5-aEY>AU=??!uziY$OPw zbtH)NgRFh5Ql9q_w(J3u-ar(CvP!ciMn73iHPH6+oRRH?^u4_T=;M5J@}CF?{YV+< z*xML*rO6aElHQ7C)l1Y&kJMUgjiXXl6)(cK7A}vhffpp{Kt4_j^qSFr89~c_PWmgN zg~n4DB@wxkbTl6LT+tuvR%uVpeO!(Es2u)Tz37p7x0hRv9h(IJA;+#Z$mrs^w~tJU z&h4#rwlGT4Wi6KNOrlVnCjiBzj0O<0bfL_n?1}}14_mEX$vw8=UWwa$F0BP|a2pSd z)WHo}GL}YDwcg6e$>|`Hu2xlF(M~+$ZW^qo_6$M=uTE;qd6~St>l!z}oH|4?Zd&_e zr3%a{lRT2UJ)=LH^t7nh)D_j3qiUTYMc6X;R#2L^nz}l2|9lTG))k2HXqQ3HY{vS# zJL1oV)VIx5mM=J4FMRXZ_=q}$b%mMp*3nZ%!YT1nbPU_?sR ztoe{c5sOSG0-H~l`BX?7{4#-iO(XYlnJrL_mOfxbGb$^k#juQ6<7idK2)=jF3?)B{ za&R$Eram$KV0^K$ElOVfw89eAZ5NHVtGd|AUxkWI09GMBy*ipMh{-}uE{|VHP)P+2 z2QJ|P->pSd5{bKc=U~h?*}6+st2fzVWY)L17nlgtCrz<1ZcWp{^s?#S5mSvKYJyTP z6?!?q$Ja^T6Fp6MRUsG=Hz{L51f=q~Jspi}#o*XRBhDzt1c(8@Wq~I#ire|qsfAc5 z)og|7!SY=TE@N~O)Ojy-p1~vD%NCax#NqgeRXDQb9widJ;8Dbc(J=Ri35Aa+Hfs0vB&o9=kot2fkSdMu zDsrY22=2Wie>73GmuJ(;h|-hij~9F@*Ayt-8iB_iErkF10o(jBt2T`hj+@0*FokIq zoVQVhL}D7G+Rf);Z@>jBQth)j{Su-gIP?6TxT^I5o0gHTaL07o;~=cQyKSUgR#+a(_g66f|&BYzQvXO~N!zHQ1U9xnq( zF5hBY6B!NP>_mGDV*}%|REQ7BVPnwl=H+y-5}ewj7P~g2_5*D~Y9yat2D|Aruj!M1 zGHLkJhxeI^JKR1W6vrtUR=hOI^EA;iQomLiVVa-&ocj0?npgy$uYkGWKr;)(%($cO zxH>G2Mw5WLis_d-f?N4U8F=^Cc!dq)C{L>qr9#K-%dE_3dgq0SFSoOv;mVv^Xd;Hs zHV`7$GVeZt%g867+P~xHuBxS@_t=oOr$X`E8qIm5Gs^ZcHws()3EUNFn-?^yFruW4 zf*S1m=)k&WXodsnB zp=zX2yE2!y7_~CojQLGD_tsLc5ZN0+o@B6 zLWsCy_|3Yh9UgoVhPyoEQiY5Jl|)?@60Ix#Hl$7c2l}|DH-vi#>hH2}$jF^uMAa|9}x6c3$4_$Ve17PtO&- z-TRn|2s&baAgx+v)d#&Daps>%5aoilzg&9!wvm2gkf`Oxj^2eitRusuQp2bnPMHZj za-vlP&ItZv&T_znUfF9(JU;zspP_E1H~yBnxf^#sa0n89^X{YjGhmr_ius+DE7>}tPB@aZyC0`KS?3B zH|7drBy2=j#p?kky{~?zhce_tT*#h!RTGJDb<_q!W4+yx1<@2sF;BwS99Fu9eBbZ3 z6fX;1{zFDyv5^unhqC3_7U%Q;Ch-J|f^@aFk#JmdUrdO9ZWElKNt+wJr7E!9*WOab z$GDczPEg05WwZlF-cx4q!pTXC@)s?{sS(%JygRCh3{}f|?g+E4(y8OlCcfa>qL+qU z9(_u;&87z>)#V92GNM`Dp6VW6uJ;<{|2J>*4ZAONa3_`ZsT)GnOzu3|!X^H#oab%H z#K)FBSntZMUwBH@)AB=P9m&JSw(_PAlT4Lx$7Yz|u>_+WZ6}>`fFZKv!4iJj zQWITZnC~UCfU@rGPB-$M$OosZJKehpfl`yZ2fMLyw3 za?xt0JXcDht;s*e&0j{}8G8Ev7<$kcE+SoxDB+By#)-Id2iALk1nO%8ITjt@XT4IG znBPX>U4ZwHP~3x`wH6^*ic84o2U86_m%dqyNm53E)**6R%nlZ(5fOEuU!RU3n<}?qZ%Ux+3;| zSt^zrn}O_h9M_+RIs3gv(*3m8ELdb4m@oTkr&-Tfz0v=hqf3)e3k@XcUde|R$=YW6sxBqpStLCx-w)Ha zr6|tK{K9Y3cEkI#+=dUe=<19M{pEo_k^sS^AT68cCW@m>jmqat6b*CUPuw8-n_m~t z#iOq%AI;$mjZf%W8MX`~5)CK5)F2iL)m*0_8gkwIJ=S|F2aPpbNZ}Ns=yP z14tKgMwcQVJef!~Im>`@`T5HL@f_Q#TRPOKP`s`PdxJ1!S(%8ZTl06fFw^C9&JdE_S*Gspqx<|B3SefkylLSAH~J7*q_pTOsux%lF7BEgKOs? zd^^|pQ7uvmMxTH?w+B?LaWXRTkW`T>54ueNYF|w@?=BwLxaoGEekCxO^W1`%`6GL$ zz-VD*8a!pVeIdx!46(6pa5h(p80%oO>1U9vu4X7zk&NWwu3-dgDRZ*Inob9+}3Q zQE5X9t4mJJJDt0K2+%(g?q%zxi^aVFW`+?Ujau0s3Dw&m0PT>(5W`ZS>dVvo6Q`SD zK)|Hew`zz=6FuZBta?5^p;KyPhHJ6J%7^sXul3XFq?dU-!5~Rl0(I_^Ta0c#y;rf+ z%wDsz44ToSNLl5iF|*4&Ru!#1n`1(hglLP)1rwj_a&WpirS z0a$c_Rl>X#2|!lFrLa{-|A+zV@mxNf;_)6sf-+yyss|ds!n8v!A{63mm?ymtAK}WU zC#WAS*x=-@%8>Lbh~x+2#}h&l(uZ8B^E1SGgUI6L4U<(m!an;Lt|W6_|Hn7Kdgnz^ z!N`CfeieXRJ_s@#^+l4GMZ#^LSkh_f>u?4YWhN@J?FQ3^qT}pr(#yL)PA*LM*P8=d zgYHHHAa1f81ReS0HON<6RN-=|n!IK1OA7jYBn+;MLlk+W zm;artS2q^+t20`rEEG}fx!(g!69A}WsZkVh$ zj(N;~y-N7dZQ$xitVvY78*!EkseFinq(ZmkrweEp%yv}`Wp@rNjPR;Zm(gsQ^Z#xD zo0n&~HkQz_&+SVuk`*#?KMfuTFPP+A(v%DxewO^-b$w&Lx+7@!R9h0J1t`2C<^T7` z|Esaae@7TLp+0e#>_@l!mR44Ej%)2x=8?IYDAmx2FL3^hoh*0$UQUyN#klh3F)fN~ zjd~H1Aiq^{$R6h{GE2%=dCniRq!bHZ*GX&h2?$T%Tu|DJ8W`3F4y{N#VGE^l-jGf1 z1DhBgU?@7?~ionjVaZQow6S@f#je1h(B#3eljPDKS$4JoHXNp(ra>)1eX1n z`XKAaAr67lcmEw1(@sf13UBdh9M6z#th^7 z>Et>+b3F(zZb%~W9trhV&p_XR?4~gpZ~9>ulN4RisP`ObjXH_zkff(+Kzq&{MqH`R zylkHz%Z26{@;Ke-7eQ&etK*}$6Tms1-C~t!5S|@|Y;dd`C^P*-=zUF9NN?G7b1WgK zk5^P0<7qZm$(`qC>ktvs+QOkI3N+=Ct|4|&@MhAP(W6CNBDGlCIgWHy+LZ4*Cn_MaF0S}Xnfo?8MJI+QB*;9)LFx>zM~n# zkvB~@{Uzp02~$}8dcGm!+H8k>;uWooljgK!(3gP+HJ}DlG7S*K?z3$AqGn0&aJMxs zBAgh$r|PA-N_eRCU_^h(B!o{LkhUwMHd7eTWQlhfBA(Qphp-FruIx0M;LxGzGs;`9 zrThhSqfn=0K)y0?H;B|QoEBo0N1;{Dmekf>_{|a^_ys51j|DKB%JfJLEm%Y?{06T@ zc?KuLdRTUY0A!KNqdT*_VoGvS(|n1U)Vx@(lYe+bbJ`d#8@nkFu4jp@cEdeR_1v5% zt8l(-d+`;K(acsV?p^+e)!+`AuDO1L~f zSrH`65iwDvKkfPZbogW)!wtGy50$JJqhigg2vhIXGZmBxCpK(S#J8ED3kBwB!?4rp z5A$ijMV2$70zooRkbG<_$^y`df@@jUPyni7V8~zSb`Apy1cAyXV$Xh|HU2KCE!5^y zI$RgK58|}z_IxTrEb6BhE32JItvA%RbQNWI_^#)ETsV;QWll^;yWOHEA}0dz7YStc zEf<$t+%A&Yp&tjZ;Wc)o4bJp&@`FnOOn_u^rJuB1CmheNMEtSP2p6b{8lUYsw2omInU2&`c-PBGTUlk9w{ zOMJ0&9sGJ+BM*ODBqv;DLPeKKePU>`?J)ckF3&O~WD@^97GtsGb2Ft zdb(}!I+`o+x}HVA9Rb@}aGNskaLT@d3OejbLtUQsgS6-CVebC2JM{92=pdRn+!VMX zg{I>N_#0w=h0az2S7~L+CKaie%Tmq7h+2TXWkUqUO`hv-eDr`Vqrx-b+tbN+ zHarHz$+@-7gHUqB0t`4={63gE4or?5p|z6eo?F1al&*DdL-KKaQA|9 zI~0pqBdT&6hmcAMGS^m1iufVL8+b(>1kx;j<0|zj#Wwp1hxMT1zGhCO1LFrD=Hn237MO-M zey#*IRZNW*%JN7d>gI4=4SAY;OXycBsFlm|Yn&DkYOy{r43%@QQ33DX=qhyI(pV~G z0nej>Yb)WpHnxO7F7KIFpvLz`ZzA!La@6%1YjHol^`~*o9Y)>G6(V_s0k&Dn&+Ykd7g;= zA`l5&Jac$MQcHu-2*br7!667y%io&>bBwFN@l(EWA92xb*|+C=>>Sxo+&1I;{J;il zL)WS{hztyT3zB(%+JDd|CypmAefRDAA0uidb0tf>?=7zT6PvIid77JrYQyNBo}T-p z19}Cdxh!>Riv7u)SDb@(zQ#E2%#kN4B)VXuIx2kT_!0JQTd6)5*LqajESMqnZ891; zXJBOjS5;y}M94UEu9%BDB^A>*BB@gtbw1|@$tdcNngFsVD|F>hy_X0k1a}<}1Oxws zCenl%An_qb%I6fd^7kw)mSGoql^?MtHZHV?Z_L;4d&u6VS(@M0M+2WH?j-OKmc`t$ zj`Y>z5AvJm3EHoCeb&^nqUnECi$4@k3(pntsf%$cE;GL0s{l;^P%KhE14v? zKVLOW7II_rIONSo@B2eQqI3i&tl> z^23)e)Y?^|E;IaYj%yLKVVcxkSzz&{2C3bj+iAaV8R$kf=)O9G_?uL-m2 z334GJ6{i*OdwRZif9ak@cE1}Aat$I?KY_V0T57)@O>?IC zTqN zrWI;0kw4~x*^)^CmWCfjx8xF%fHG9;xyINRj^-Na>NWG94}R!BL_2-K`9qzB>AyvF zvf768=x4+e10UIl0+gZva}@Hmd(l_7dpf({>xmo=@6XQSW_#}uovd{b9J&$530@)J zoh)5vLzSgT$;#&#US7`sl1~c%W}2_m4W9Hrb6u=8=`$5Hd^Qx8KOZklAy4~4GKXz4 zyGS`gHDdxl_FA5y5~+hH|6`nV)QPO;+0Myi?}2_CVkDW|&tS^=)}8B^TAbQU5dyCk z87zlD#suvv{Rt~?(2^}tIXx8Lk5z2_)BVU`+R5X4UD_Yq6qE6y7z5S#^NjNCWs`N< z>lj__8n0i6-qz5j-)Sj^JK%W|tNR$AtKs7;;a|dc(TqaCG}AIatGnWx*c;kjx}qE1 zozkj#_Umoh&zHYN`ru}gvzg-yc~oeY6i&i%Qi;fpzcmU8}Ns+?a^g%N`xgts?0AvE&ufKfEMMazvIV>!8bsaiC^&#D?rxtgU) z225L4lcfFIlN5tcb#*$;?T8Nz)*rYPd!IH{;?Q?*65(GK=L@fVVb0T!{Ko-X`y7 zw#{T3@)SL8LGx=686H{e@eQJ5K7+Wh8BmDHdFdwkbFC#&Cf!((VSjJ$V%e@{Gg;e6tWKwq%Z}@+OYT?G zv-eS1Nz8@iqUbNb>z@b5$G;)1sHcZm>lJ)!Dmt@|AYh-1lX)*ptjLO*l_SpDdt_Hv z!+1SzM$GF!yX~*X?nD9O676aI0(M}BTwK`Nw)N6Q}96=3(&Y6*r%jZp+^D9@U0iDrM}<+x@W4#LSh1@UqyUCZsK8PV0K5J(+iLVpPat2*zA;4%<<0 zDhFpnjT=bI@cJS=+@_QhT!rIS8e4hb>Lx1IqrJX=fp-=8%{`GY%tHDR!fzp;K$J1c z(bbg|@!q3=dpy?K7|BAM)^w>+idL_JN~=7Vojo|xtYrGzx8e>$>?CQ`DzXyv2B_ZC zhu>PONnq^p!9z|u;aet_mp_y2cQ8BZeYD{O$`VeSLPATILW;;9;is8E_-j3mF&^2v z1{I2&{?)?<>)1Gu?BA_MiV;g9Ob<3CLs1Lc*sIuct~^h0{p5Ydlt66BL$&(w5m`fU z{D%c)wUoj11^VyZTmo>;qw5;{W2GfaHnYE#sGxEnS^w`1Xk)20k~h=8)8dPQ4-ajQ z-xxC^39bitUA0NpYK+iYI!OJul~rrh24*k-dNcu#p3Yn4Rq z7!_)v17)g(vVLmRe(X;r(AczM#JP@=-^iiN-WW&CC9<2TVU{s@r zgJE3Hil@orJ5Q4c+nqBZLf{hlYAyNFck)3JI_*(w=+{9>dq#H+%YB&*QyF$;U=~@7 zJ!K6%0@-xw@d2G>&X@ND0WXXRQ?BFaqZE6_ex;ae%nisc)eyk&>h!; zG?ZBx6jJB2ZFME`2L-dU2FLp?cAkF69~>6Mm_0FINXp_0goRJF*&L0lw=9<0XjgOB+p`@QWlrl;3mqEZ8y*rnu1p29t~HZmx)n|N zJlPmLPb*LT4716dmyGKDZp56oOeaB0V}qkwC3o!=OEiHP834@sDT86*W1uv|Mj}ty zW%^EQ_5RHhc^koE6aK**ZkwK%)YmFn{T|9Wg{-ZgB-}BGuc&jo&2bZIw(r@;=gGg< ze>36jKYV|=t=V4pJ(pq`;tRn_e`0%0@a}M>>7ktz&l^b16E4?#KOau4M53$oYwRUk zy)N^G0-i6298P!7|Gu2-XZ$)YV@-7eCI`Ii2RNEUdA%Iwyp%zjkJ4rKW|#;>o~Gm2 z*x3VDoVwSFce$S``Ahix)2?4KKD9eYH$t6`xTWNJwJfA*7njz#VA`~88IOlG&PmkF zJe+ap#|mzxB!2{W^Zv%JMc5l*ey7B@Ns&^-sn}S)5dP!9IvJMhS@gt|Pp^hIV+jhY zT6(Mb<|CktvHOK);!nq43Sy*Ks=)~ZPX@CBj{z9mo~+>U%7WQ`_wzf+yVWpDZKOVe zkLE6fEH(g%2&(EV#gOs<2svXBO0ht-TZ58j_80P!zkLBxf0ExFXf(Qx2lET$Hb~7P zKE=QE3myDfV+92qvrrbTo!>-|DXIgV!edSDXqC;L>-O0Lf~eW>Tc%;(J3R8Yv-RUw z2d^X&h)kZ)nWVM;l2Esu7&L)d^PiXB8hkmjFqmo#fRe3F2-dgQOZ~N?5S@JI2`3Re zjs;edd*tJW91O(Cw&d@>_{MkIFaqCoiKWq;crhf&B>Qw`VX8V!0XRabU*)Z#;FJOsfUvc>LYKn*D?s zcaM^9@)i&6teTF>n)JiVtSDaTQh+7?ub0P)SBMLV%_!FNJGoT>QAyS(L(QqdY10Y? zX{mDWBLc4?EX$g1sg6hmit<}J%Vw=*!Ss41Dfhino>x>$$ra`{4 z0_}K7p$u{Q!~yis-+~sZ$zuwcKUE zO8EpYVnVA-JmjR}td$TsiUiMRxvtUB(ma&`-&CY62<n&dRUy^-84a zlGt3IxsGNyd0<4Rz{8bV)TLX-DLM7*B-x`q`5vV&WFq~Zod=0g~0XBY>~Lpp1#s-BB@3ViKtB$+K*@6J7R^7 z-9*!xV_12AN`tfz2%L84F*c_8=T&xiq ztmEz9hl(Irj+DIZ*Ds+A;#-SH$CB)cqLG*7Yyt!_&lO}uD{e$&=F3lq+1l!U`>O5H zcd(cjo(@<_C^`AUJG|GIfbKDYjyyn7SxX5@r8@S)x{&YIBeUXYHKbWT?sNFR=9~*f zsn2MRb8mZmbxnk5Gv;%r$x4!-P}?%Q)wOgvQbs3t$+}TzB>l2)v?rtvdwrG4K|RYv zc|u#pnsxhdJM}aCM{}n(lDQYEq#2teS>bZ@jtMQ@ik^JKu7f3i&U#)a3A?2?3}qo% ztmR&oTeAIxj`;=>&A63g#J*1m22Z;U)VTyfAln$fa(0|_4cD4M6?wRzo#+s`8hY^} zUjS8)4XyEMp|p=@0Jo~0C+N@I{dtJTy>^FpiIsMrkf*bHr=%$u47TrAmjm5ONJv-? zEhTqV%JUTa#9cE=!m`rN4>ohkV7Rlm~_D$%|3y@r>Az4*_9UXAic#VDY z*Cne#P9&OK*lCN6*@eXvRZOzU69WphXEw6YV5B*dDLT3lMM(ylflk{inNGBKZOs##836??i34b}H&6!FaWrrMcYFaC#=*Q@$xe z1JHXu_qU-fv3Yzxk@?Z}q2?|Rn*z{3J8Kb6`qHrZXdi~Y2^+ZE2(ZQWRL>Q0pGgOw({=?Nx=Ygf8#!Ds|PZ`l&1znpwo#E}j5fSJ`4agG#6 ziq!eh?LqgoQem?r)#GsshSaAtR4aCcJ@4q<4k;k9egiR?uj9}ZnP;AvHG;Ru$VNZY z=#WyrPaub!RfR19HK)8%K~kQYPYH9EI$7-aJuQ8)XHhqC&caC-(m8K$Z6#@AdROppHkA~8#ch%zN&pWq--5z_Bn@S=#B` zPxHhoWPOFM5;M2N385dkl)ep~aQd?UzA^gbHV&4Cd~GhZw^hT4HYGP8z0@#;Q#X8< zl)s+RNE%=ez#QnEZat$wW?AHhnj807g8rI8?Z zw9R)CXbK;rKipE==tb**P-YP`aM!5$>t(8S!qO&+PmZ|Y<{}RG>T=(+Xqg1dRlOYK zK)_)>FYNn};ZXLDd|YiC_rd*DLDSCVSX&P`cCN1vqq`o()e#DXI%1o%AGxgdgP^b} zUa24RJ`BL9XcmpFR-WE6w(@Z#0fK7|Jv6*KPuX!9d>j&9$_W=;GsEVBVEl6H> zC&posBl+WY=zguNkx+x|2q(E=hvktP(mSNll9dRBJ`&q6%{ z{f@HDj?>3+J?cS}b=MfDX~afj!kC)<+xuSH$AzVGNOa6~k!(Nyk&Goj)VM9I&<_Ok z@9KfQ0R)8hdLHyg=QH=NV+YQjJ>iW(SH5FpF={P!G$<->r%tDR`=p~#LrN^o^@>2K zE&4V2)uI=*U8&gx&zWfLi`4F9hmWph68-8nFAN`Y-;#^o*u4DmHAu&y9L19!m3ytC zjH%%P!rFLomFN8Y-1g4P=NI7HcdlqT^_eVcKc4bl;BtPhy#`bqFL(+0Y_XBlxb2+g z`Rv`wMF-}3h_vHU40E49buRF;qQ)_9{YhN~@2?1I6?+=zVq`&9I6do6wm)fb7o2*z zP!4cOmSLj+>a)er*h#^V8`?98mrbPU-y=xz-R`t(91*r0BRmkOrQf!Ka^sR{6vVVy zNBp>7H|Fn=?zqS`YR3Lhpj!InoTsV`Kixs{nJ8Cg>wEL28Af?zD3Y|xvTSHDr|TVQ znTvJ6daOsnR(8`0)W~D`w9U82aIK+2vqQfJpirf~*5%79{O3@41t52(@bfqjk!vuaXV9z-vs)T8aUgU8@3Led z=pYU@tXQvvMf$)L8HD0-bs^}tyvT7p%j`o7VaxFF6QO0(4`geNDwL12f^k;~yYtT| zpAMa~Rcd^@ZgV@Q#z(DI1pXi;zZO}DeHiWA_75&@%upmlVWwgo9RUXwDVcsws1G=Y z(m!7u@?JiygZSKS$eUzFi<9(hai#dVk7PV$)#d^X-gPY8Z+TL*AsDv@fSNH&YOM?j zggy811zlFODvuNkbaNzP>f6a}a%q6M&`fJ$P6+(_L@(hlj@YccTWRZ!7`x0XY~3E* z#Jo<@zZQg}ANI*5?QS_foyrxSwIZxxu0d9-PfPDT@=~VU5{X&-vz3f#ZK*UXsJMl~ zVSxpFe}jiqd^}h)Qdt_;Z=G<~I*Uw&WkwWwa|&g?$VbNT0rw-)l0Xcw zF@yLnkE^W{Lx*2$0s-#l&yKtV=JQ|Nr0yFIqY9DTo;OJ63rm>jiTcdXS^Q2Cyk$QhFTwWIG@atI%^t z2!D)G(9!dI-E1K4?s*|kqAH**dE6uvsr{@)2@upYM}8 z-_DD)#QMy!`%nd;XeAi=<(ZTqW_m|1ZFyY#kBL{|Ji24!Rnug(A! z5I~V8kJUy-Lr!qPhR4`$^CFbtWzULrqijKWbJaXFgezE*L77N-v%-m8Ti(72c zQ0hieQ(yDyn4!tI?JCLlKlSfE?OYr8*Ry^hfAn>fwkyTNP@J(5nyD8vzdHe+OWad- zM@u%f;NbC4KPAXh9v=D^L~@Z7OoXCFIg$20ux5*SpMPm&i2{A6to zhAk~aM3w6tL&VA_!0Pb5P-W6LCBpKpKItYjI{_uJXVLF^U#8(XusW)T0K4> zXneOOx?!W5!_!C1qlmOnTd?q3+p5et>}<8w>tm}geQ4gr3ROVijltQ{^3zqG|58M7+swk>m=VqPF-6t*;6d4 zuM>4Hc@^kp79}Fr*DEe6Y^Q+sC(8UfVn>EA91)<)9z-~zB{{QPgpIl{t(ueGP-YVf z$}bDAWT!<-(c3%^aHkZKTzqMHtR=8F{TA}z|lr^=y) zo=VYViB;lPwpAr;EDtk|7&i3&KLF!E9KSN8QDNl~Wo0wNve-$|nu^)9w=J2cYAFt; z7>7WJSZpj*3qPRb^%mtxl4Y7N(c)rJR{4_B8u!4R`@X$-%yOY+6e6AW@c^mNOmEiG zL*12BUeP<{;c>k%x#HpRexXW%r8SdPHVkSw^xfy_Y76^L6!8D~iyz{-1EUx##Zis1 zVE`LKJ9DXud@_zKg=n%~LT?JVcjp@X{^#z*qjzsaUydF8NCU|<$pmF-H~HGGku1J+ z+bVqFu5}nl6%lVxu(LtXS6S5X#Yrk-yw=&^9-gn^vC(PlOLw7k+wI8QbqAV#eW;KX z$0+C}i_K$_QGL(7=L?S@v1=SPZ3+-VGx|e%#fzA`Fp3D{AIYSU z(1_!zRU~m~hLcCUlVmr^SnG6*BGXzdv5wL=)?Z6E^RuQrpkEraj8YDfFR2!)eIeklVpsjM9qpVD#wl4O0K-N-A`#;y^H z(FO|f21-fhO^W{Oc#Rm}KRe$wX1?U79XTg5Yh{Xx{#w59&dik~rFm3}lW5e66hZ8e zv0g7WN(*$2Y(C1fD-|7PIvvYE5lyNZNE$v_-*8fk{&~ zW@QZZw+eljXG1fmJWVE$W*B_~S;Xm%@;@L8YTMYzMAAt%ke$dR8KcQ*EX)GZZ0xjd3t2X-<{y==Z&Pe4*kGMGdj`)v`@F3+)OnaX zW6~XbtarX|-#$Bs^6&oc@9_Qae;+^n=}+;iU;WC?$$a(ISB;E_c*wmDZFi(a?wxYv zO2-Jful;B(rre11$&HlkIpWT=>aH&s&CJZ8 zx3|{_prGgT^YeDdyyC5c-t{?A?J{>H)A{4bn&Kpgt9=ZMeH+zyTwTTK}5OW-V>bFXxX- zr&PO{gWQW`>If*M_gmlkmZkOQKmWPCf2Dc<{{8k&6^_y@e?-)*T(XXcAlQZ>UPTVg zcZF3UIUb)x>G)Yx^u2Hr!?=#4Vwp|oU1qZ6H6q7y6FO8}rO`kA2#f-fB4TQ=076jj z2#OI_61~c)Gnjw<4Kzo`QLZ=9ee+Iq?%0mR$dJ|N*4RZ9PMor{dRrvXU8`3ixqJlZ zU_BBW47@ectIazst*oZ(ps>z0XXa6SelMn;dJYNJ{YZZw@_TLz&hqT;Ky#slxu>7e z;nvWnA+v)6$Zpzz=$e&*ha!R(#xVKJUNkj(!SE6!#NE5L0c%NMMdFOWDN~dQ!9|JJ z1}}SeeCFhg%wp`QMz!=n=bIimL3JEWc244*IixnMMsDk7Ae};;q`An>%ff~8B(622 zmkpqI+eSpztz|wW_zvlBn0DoY-iiL0`+S{DzjVxl2-Da+a~{Q)_G0?vDO6a7H1gZI zYX_1W*4ZaN%@fA8!9V$CZ&mM*1iUq0M0x+4SU7eHwQ>pZ;XdTHZ9;a#8p<+~aLO?` z7lL>Ms$IX7;18Mq;NZ#U5`h}RrAR(ir8R(3rhvRS*TOTepTl<^+lzh2#xPT5@4FFa zDO9gqBWY|fDSG2%fT>uW#50XMcWuOH@866)+lMgFsn7Y*L;4lB1!wg5@&p!Mc@5*g zd0@e%E4NO97J9qn*;0$e1~eY;)$=sBE2HK?lYPqmNM5)cI|H0Rq>U3olC0x5Mfk2^{G#hc$aT3PP!M- zQ@Z}@ul~vi;p?xzZei^M+0&@3!q>YM33YkY?ze-}iva7rDo%g%H-BSS zl?9P{l?&NZ9x4yi2~Zpqo(QqR$g?abw04ta)5+3ts zLJ_TE8Sz@v%1=a}id4BJh18U*#n1lb36=b#&akK<0&Aw!=Mrtw5|zm8JSxXeV(#@f z(YQEnAC(xoV-ND%w<0>wt3f=pW~NbKnzYkhd;EF^hLBphoJ6t*QN~47$ES{2Z6+~Yy^iT- z$9ysG1D>pRz&En^r?4WWT0rXe?Z^BpuVaCo@&-H4eK&1E*X~`2u3BM4SANJl>p%;- zksmCR&Eh-?lqaR*Cs3;_ASUv;o#fL#cdGUH3Qc)0XF*N`aS2rLWa+?@&kqisd@d2F zv094cQ{qUC%(>|*p4&f)pFVd8FC93Ki6UivghIC^VXlfVo0_sBX^U1d+?Bw6w{FIx z_io1RTL&@Jm4e33Y(0{i9g)w{0_vJ_{q^&hdHN+pPhCKIwur%82f7CP(I9c0T_|Ht zBcN;)^w~fOSxr4@+Nn}&kSwr4BB9Gts1EgaAe&E65NTphZ3qRe8WWvo$VNTc)xnUP zs56W@8um*U>;AR+a4K=e4aat=bw8H z9r+F;pZem4NR-HyMmIHTwsGS|+c|#cop;(-c(f~9W+GQ2J|b2kpdyzdQ0)ZNK_p1e zHDdSTi!b7npZp|Nty=XP!q<@?*_U2QdO>=TBS)?jw$8|0vu4fW$fX3j$ezfc(xT62 z>MF?nJCRStLCS@t5laz6jrM)}+uyc>;6*eQ-d%UyW$KPQ?y$U&+3@hN#pm3)b2xVF zm=REsOoc7-?#QP`KHYIjijSu6HEJo+sCbB!D^Fb79Z_^6x_|xGe{G}B8Zo}eA@^cj*;W$3-T;_r32~CqeE-DE02OBVSjA zqi}VEmBLXvWlz)o%Cj^{LPuu@QY0EoA^)PmbU2ftkXl-Q&TiUhQLc@hf~BwH-E z4ITNTBbesq*@0THW0?4o0%BqD46eb*XLxT)2=&HrgXdBrpSJvDn&kP&3C!(3i29`o z)L6Gh?ztQ3Et?SO=`y0*EEKSC;4M_f86S2UJGy(3TF0`nY>?HK^-$g`-!$={tM0|2 zSl=qAM{(h?$C0=|a>L)vs zBA>G_zD|NVfhOy#$Y;-vZNN(UAvw@uYDDyuMCPY0qp_1PcvW233DwMp;uK{EH=-{w z={O~(tH?50GV(ctcvqg}a}CMo7TfXPyl@GX!$*vKYD70ZG>qQOe71Tm^Ccjk3e!fA znKoN*Dy6XM3`YkN>rBtLj$r($=TSU#)J`*Kk+k>SelzmBb^s)_&@uwWlS-Q+^?Hp! z^FF3!5$s&gzwstY$4*c#mh1xqx$PV6j8r48A^8l5Clzl3Y2k21jw}Uu^7+BRlg}lB zrAj_U!N%vSc=FY=_|Y>5@#>Kam?_6l(YM;0+E|jL3=O1VEZRUiR>eqH3=iDA4qtfi zX6)HAi2i(1A4;*cWokgR_Ftn5n4ZGyYj0rk*;i0MdJg$w1+fK^LiX4@x-!UiWKgA0 znWpfcr<=OgUq$E(g{=f`Q&V-dx=kgS@XYzM z_KD3r{TA_2*cv$$K@?&6%2&Q(#}?gp-+j2{mRpSA$eu`>h@D32M1~b2 zu22L=#7x3gQ_vzRpZUyZjBII?&(f=wgm|Z`BTO276|r>0NO5pydFr{y(3@|*X``Z= z=2kqfhkQEnsiz57)cfzh-@@6lWs8NO z^h&RehVo9Mta>lSVga4Z@4o&%q>^k{MS@ht6cm;EZFGQGoE};Sgvi?v^-PQFpqiV#jaG+N~7CFh@eeOqoU7NzIh1E zi7ET$`_O~;B1ryX{PDVUwmm!B?7 zVCIE=sF8#=6A>g=kbG_)b~)0Yu;TqBe>ks{SXk@?8H(GL1zi5+7S zS=tR0?a5aPlIqdRsO&$C>1SWY#4E2ee<#o&(M*##cHbS2{&siLlYnSi zo{2zG9!VA|M|Ff;i)j=2EFV2>o37l*XKwx4@W>~7>GmI7rJ<5AGyT#cah`mBaPZ`F ziD0Rc&k4%NXWzJhzj6&%tpw$18m*dk)QSvBZZ(l2@m$s&$9=n2EF#UuAyKcQTAV?%JcIt8Jn|#} z3-Khz3l)^=2{cJ|14&N7Ym4d`A05w9o~3M!V#~S}=+HV(O_x~;_$xsz(kN2e*@aBD z8xhL=%Je+yB%u*D2!T9rl3PlktAVJZQkX|!ZW<9b7U|wTMDtlhNIa|okmvNX(rV!J z#j|+k*UzwR=)`uCC<#K1_=(W{!5{pAjjD-2XO{CizEn1}22(^z zBt#>Fn(lS>MRX)=HF_uVsgX~8-A4pcaO6_Z)hTzcc*%}N*F+vgswB8YgyfGSQ;vLU zx?JQ_)7;lXKJ`rgOKG(5$tRz*5kQefjd1?qAO4|{FcC!gr%^O9oa8M=lCW%K8Txw%Sj<@7Sk76btrBS#n0H1zqxl@t*&wau@&an=P>DQ| zY}QGHX5TuD!oD{U(V_1b$55M`LXG*PQU3^Kk~P`k$Qd(B9^1wj+eK~96cY8?&~x!J zO7w5$z!AjeiimaQ(D%s)kl09K)4?*xI7eBBuwO>kPZq(}m>5_2^*dffbN>dkG~H z^Xj=vd_hs9Nj|$ak`(KlVG`S_Mx&?LL71j&54MoS~%d^gHE8?|M*4)W6eNp72H&R6a8pH=$VWIo1+ z`fX`IZawo~a>B?bRrs!hAL+wuV7O%9$>#?LpW`0yD~?Sy@r%6&ab$E7g+>&0l0Tij z$xgg&@JU1)yw;FF2}Ah^?!9R>e(%vcar>q|^icT6MF6P8{j|QQsZkfrAyyaIS@^Ph&yr zKkG4^87tu8L=lBb6E%jT170LkMJTmFL7(evr4qn~<>-FkcJ$wS8zRd`P)gDtw(Qzm zpp6Fl!cn4CL%LEzEg=#&VNAj06*8p@4E;lA;WZ`eqf)?|M3o8Pn%K-m*yuU-$11af8{CMaD> zzeYW^mQl+CL>NU*zy9^F8wnS|cIkK5b|_sM?Y#HidoBM&z?FaUw>`h!4K&p+GOe|y z%6}1HeF;e$wv?ZG-tMOhM|K~6_+fnc%U?F~sCS}`NqQzI{!WSbs#Bm%Wpb}DzWUX# zTBky!(!Kku!;up4)tXz4kSd=v>iycj*Rl8IS8OwteOsN9UV~G5>mhwm!8Xzt*}WYj zUw8zA58sE_mbF;u&7mBwugq4N4%XevFT9Rp-~A~L{O7;H(f|0@IQL)v7PCKi91Yg( z#)YZiQO}_k~&b{c8`Z~Q(lnt$2HogHNv!G z=Yf(;wI-&5(LVaCKe4Blu_!A3i=54$IE`qrj0XM54-FzQ*l&lfvtpY6HnQ5)Nun8$ z(I$y*OGLX!S)!3yv&73{2GL`g7b|FNAO8#9{9pe9hyMLv;K;xG&p7mN z{}T>S9sb|`3(fvB4*ti##L@pi_2;z1=Li3scK+Re!s);IE=Hez5!JCNJH|-opEfnK zq8FoEg=fL*hH+E4`V{He^SH#0>B(>X9Zvn1zsBhQ{?{1)i@(C<|NNJ@{9pbGqyOnI zaPmL=C!F}s-(iODJS8&4GLq@;z^dIlFu3z3JFLD%f~6yytn?@x3y=A2e__y}E?h}V zUMeMB@H9XW-{41{T&+Ajt`EMnc)YLp@kgm zS7IAO;aX|1!Hgp}+d};41#}-ef?MXt@Wqh~9$3?f&c-y7DK@NZ|21tcve+U4oi9f) zRcK;zPLz{~ksvduTB}OpS+|pyY(tSoO?%l|-nt6;-?;;WpST^-6@yGql0u&(q0WX* z)9`Fy($NI+^(Y#r#&Gt@mr;K6FuU3_^qdWIyoDP5l3-8TI zL1AfQ+_TRB<{6*7vm5|bheK4`2rHJpF`hcI;NVHH0@+5U zXsyCLuz3pdQFY{4-gUsdPK(f}DW9d)snWOIH6_l7F-bNWNhXbCUvIG1k-gNpOJkV3 zcu@;tEz-7HRcjrY4t50*uT@dJ%ue2kQ{;+GJHeuF{aR%7J@f?2I_QIT=hP01S_4zD}y0M|KHEn2G`A4C1fMI=s4Abn;A$+I&^oSQ-9 z%oLhb)#L2woti}C6ba_ZDJ0L#B6WHejl*MTo}55-riNUV^__yn8eR*4ik;~uUx@w` zkyey-Ji)}pD5S28OqP?MdIj5WHs8kFi)?l zNOq+#ylVqGzx*l0wr;TWDsR<^H{NSuDkz3wVTKnif0BmwR7L{DxH?CnRS%E%0-k(& zys!AlGp}O2*d%#OQ~D*@SgJvi5R{OwvEi;`^-u<%zI!`<=e}*&uq;EHQ6x1=VKk6} zn17O&>XSfF0vyMr_nF>T<#p1`7lDGo?5r6sdlAH z8*HT7mj<*$_wQt;JQR7mdXtafi2iSb+=zT?Gm;3cMxwQpz`Yk|$B{u@^-R#c;MTpW zQ=z2>@=xK*p5BKDr$%};HLoQU8ue`7z~%gP#9QIHumwF=I`v#(DZe!OeevQ2y!FQ%5iZcCNImoMC7sN=-*C zk$h^MwKfALJ4xVET80w56N?i`X|yAc&Q&WA%VwCSC>EwCQ55+UNfa4m#j!QkioZq( zXJ_qeNag8i_8F6?=QBucSc_P9SCCJ%qtRINzq`jV9ex zNHA-RgrXsYsSd)mmtsk?b>J)=3|b?-RQ2F=4Uz9grED9CMBtTe^=6$iiX9XBT_(jZ zvcq1gRxmj>j>^lgqIv2pw2{o#r85kr$U>r9g(XdxN`pEl((92rC{iN%R)9P_-b1)D z=i%|b;N+=uc6fUWY-Cy~N-`-Dv}S_>vw_a;G#72oq zc8}UfA{zzGR%&NwOY?N}r?U$kYu6y&*M|i)Bx;x`{Hw7Rsu3NZTt=cWiO9(#NW8TV zTcP?^Y*4&J zltn&8oHbP~(k3G1Mr(gtyxZ-xr`JJb#O3GpKm<{7(xLpC^4I91o5q*l@~hoH`LFPF zbzv*+TAQggyjq9q-iIK!S_>+&t=;q@w;J)(yOUcNcb69T9tDM=a^lL0ptYjfZNGWL zMrh3M__3onfBvjd9*yKn*(j*Im7W(ZfoaJ=N1o+%*!u|5+czWkz+K3H?XwvCAN~ba z{OkV?YyaifvFvM~LgwzBXsjPbt%u~1957Z`K=kwl6rOz*qu={EF8$y!RA1Q-?QUPJ zyUfSNLJ5uHf{pSwnSaU74)*z2k5mB_6D2`u&S%lHX_JvqEg8@Ts0zs?^sV&pY@KCHXM56pv%3?KHLFOb^Oi3nR8sOAG;4NbY^`XW@u={9ltn&8VntBt zXN&|_D|}zLTS;Tg3z@~3}9^3v8{{kETZ-0ah|I?pfJy8n@O|IdGbmH*wB(f`10?1}WCOj62RF+y(ZOsO== zC@HC>1a&^BiFj(U`w%OA{3Hgx{yP}_#^*5j z&pwTz&)kE~9qZBROb1J3CTFm4;219d>Uqrk`bFT(1?UJQlv(Cg_H_WdcASepGJPVS z`iMg?@)_oprr`O$QybO?BbUsAMqwWHi({x?8V|{*EYgk0BK!(>)}fUwjn9U;h&GpCtD8zKZ^D{4V;w z@y{^u`(H=@fAcjAeC2Z(`qV?{yLA^*y?v<8l2o4=$M}n{q43(9wwqpSNVOK%Wrwm* z>Aj)?W0ey-51G$dYfJ@}Jv`n!T#=$49`6ITtzV5?yoIFJP3l}ZHo8{qG=j+M{6Y<{ z9z2N`_n*Ppu>z`+|9qlGQM=kB#VCsB=5c=SDIEUA8#wrrS8(9(_u|mcUd5qby@m17 zGBU&K(X(v_ntd8o07}gYT1g5`1=DOGOQD;enL+f}QN-SS4ZE8~d}1hv?Y(hyCQEE< z>lj?ti~cnuI9Z&ji zh|Sf{q(odqKy(hM?7ERV*>!e4j1a-o?o%nHK_j0UF>H_bJH`E4`QXe%^aSOpdnS^0 zJ&;{31&|*aRn`=~BeR0SaN#(;dvAj5DO{}!)u^QNPj+NiY1aGEkxUv<)von-+I{Qd zEqCqVyL1WC=khrWkbGskJ25jqj|uv(j*q6Ebxx#}M=FiX>pV=k(OXy*Wggo)YWN#LGJ9{7tkj zP6o#TEtJukUof(0VKG0FB$rpnX9(#VR>?jiAx5A<0W=AU^_N783Ah_e$B@XHO^4FVz8%M52$^o=`u~#Veml^+|>1%o7ZD(@i(ZntEqvTLd`>hZm>bt_|`? z!^&M%eR(Ge-5vd^ATwvqJ#zTm*K|=zw3oX2Q^b&sf)FC|i>KTm9kT|Lh2Rx28*|zHt;&KY0R|UU>th%WP=NHIhjk z4@E*ilA@`-STcb|B7!s<@OU=G#!L;1C;){y1fJlxbOOC`iqSQ_}oL-PS zM?$3JPFImn5gCoNX&PH@WG-SS`yV#wxFL~bku$Af)CMDsdMZB@cg49q-oGskN~^m% zz4N1;AYKpJ!>DXCZ`1MO@968N;%sQ`+GR)1P zMe?XPieSd|U3VS-W5t^xDtko`HR8v-$gLbftSfIPUTA84{!~by!cj?cFgcC-+4HDf zo?>Ih{K%v+ux*Qdy~xOOm`=Oub!5}_v4{lgn>N$v$R!=9uaQ}ufT6gEe>2E16QmR| z)j3|Z)>P}wl^2#DngQXvp+kNB$jtO5r0{A=0W;3En!dEgI9fuf+z@nlZ?{w$g^ucQ zdaZAjoMc>$kn1=ol4tf}*tzC?Xx`LPf|bK)-MkgahwnxI?|cdax8I6-I%{X8&L2OG z!g1!^4AZFt@5Ai461Kn_8B#SBG*yks(N%qtMQa`&?-5wEJUre%JiKc;ZX(Ic$19X; zB{qy=m6U#xXi*B&Xb$B@5=YKn#;=|~gy;93VPi?M!M31&u8O129>l??U&oYona;M5 zS%@Q1B+)8Hk*Vh}K01dt51qy6d>v^L(8$U)X!iGGj#9j;mL#sP8Ig=u_`KRcRt+GD zW%~3ATqb#(O{7swBXsDrL zHmDKizrGb;(})o7MN%B05COXyG8Y+XwETX|%9CO;`J;XHxE&doD9a^qgMlcJ_6DJ&--+p$kLt5TO_9d~dpU&t+H2kw-z# z9c1o^r0gp`Qd$xr!mUwNP3=23E-el+m;WwJy1IKKks-8JI;BxsDn3QIRI$&$(jpT? zrDY#V7m1!e!x^*!VOUl!t%jl&R@1CW!-9#_+a%gx*xd*{rBC5 z?lmjXk;x)M(o;Tt0j(1xJvt_7ZWho%?De3W>uWi7wx^9wG6IT&3o9J`%&uCFL|-@J zOiy!q4h!cmqBS!YL`=j?X`h_3@38BeuouVkxxyvyY!jA36gSl0vWEY z>twxaiO}kRc={)ip-Bym{#gl8wwOkn|CHA>;=K-nH_If4BAv}xilj~7VAmRLmQ@j3 zv%|pU2d}|dup+7~D>Bk!so-Z(uTOF&wEV%=mNN{!Yk8x%(Ma*L0csU9sv4Enk=EJi z)~IXjrcLO+Z8wqweaKOURmZ1L8s)nX$<}dIj=Wo9LVX(~n-q0Z3RmyT!{a@MRZ9<# z_X~TL1OM%3@5GKR%MnS`QEinevnc>o@@f*aNfYXYg)$BuJBJ_t>{a~oXD2Xouz{C< z_#6&A`7(;Lu8i?aGljL3-th{8ipc ze?5>t?ZnRIi&Q(w6cmOtle>1fGzkjZrAdBEx%la-XD;pXM|xKtoE^cr(Q_A`xh1*K z!SXQ?BQgnXKq2ksQ!1L%VQ81>U_q_&w;FGuLcUXDe@8`LoX7FfunLfn$q~ydYeSm9 z>;}?b63}GEKHb=H>n?QPv<1n$rr#MN31jmd3FFihTGJ$;g?T%-Q?mil90`11pE4te z6P1x31`%+!2vQr@0|UJ_bCA*|y@?rA&zw`H$rk@xm^*VG3+FDd?(uzOv&b(SL1e`; zAd{wlK{_qzBB5fNtp@n#^Z9YtX)}ztn3|-jeMlC_}W? zJJRA+hdj|tGDvcQu`|VPC#}jgbSBbNJH?Ml9OrHifErV%fX=Yd&d{mgW z9ZjRB3Y&)ZdYy{$-WH51a-mVE(U+W{uc>WXkMxQW#Ns5fB%Dos+Eg<$`h+MwGZAHe zhj}Cf-n|`)w}tR_v~PUVRWdfi%z`q*o!#!@&VMQ3P_TiiqvUcq>5}yLY+jiRIi|w zOCrB+Em~_f;y^u#XD*iz+jSS3>o%j(+lK-Lct!R}C^ZGS(5R!xurh3<;(cAXyfA}9 zXOH33#3*L#B^2rn5@a+4Vs7bU?bM+7*tzgrpHc!NuWvp|D-tHL|EpL(YdamGb7V&< zxX2%o(BQYh`;gi#LdTbd{V9V8lBTR<+7L+c8PUlPI_hk=AF0*Lk?HTXb38T5wxE&8 z*%{k3)F_uojDwD6Jd*`qhSg(7faE``UJwq`6Cv@84-X)wGgVoy8nbgKoF5HFDOFbI z=Gig5hzd!m4rQ;U<5+RiRzyWSm0!w3rch~-zZMSTmCR)k)%l+cD54F38u`>g^UBi* z>w`VuKi$jO6#^zhUan-dMON_@2@M`l(OqD@%?*Fdn-FsIHt?CHJyfBmgvH*jcE&KT ze4DgGy^jCTnq8W@D2deCr$X}?%0`weiN0nHQKeJIH8GzI3S-gL+o9y!M#xa<-twkR zJ~(-z@~nJPS=QCV<9c!J(&ypv9zio?9UXBzaOXOF?a^Cs`?e9JA_XK8H43mg8?Y*3 z)e8C(DcrVlHTDcGL+R*AoO*db8a|mN>a(0`Y;%1%bZ;0zWA!jz zX9M|PkDkSMPEX<4N)oX>ccZ>xBdQ(U6x1oS8Zp#k2{ik9(b};U#hqJldaxV&Dn;y{ znZy(Yv(~q%kygX0s}6gPN9*W}RI#HYjZc#pZ9aDa$$hV)dH5~FCNCjD0<13})krAx zRip?Bvd#uAkyNx+jG*tH+tB~%`;oY1yEUfJ!P#uGW2}0T)vb7h>F7p0ox_FsGkpCL_eK+xXub_BI zDIE?vy>@hf2@?Q2G0y%$3gNen{dt$swJ*g4FtT8>n25AQYWP{8!* zGr@-%Dy$1Enl^ff+B#zaS6kuZp}LNfEkrMhaK*Ln;{Eq())!V#Jny%YPBOFp`Gg zxpaEQxKN(RZlKJV{s)@CnjC0ASMN}9<#RpI=x34vr}$QBs1fc4322it)cg`;FYrV^ zSHS0zxB7;MrJpK@CoMA#Dqrfn3a;L(ynYb%$zy3FC_Nq??-L|^#hum+cHn_sYw(HN zH(>M19%N$LfK)`TRlzFu((hfr9=8vVATvH;-+pdP7LaO^*fc0;wF8MlTYp-MrJj8= zn?%=!}|O=zxKgHo;ovm_h^HcqAWt5Dsu z8^>3TU@znKdaZ&{3e<{r^~OY2G(kyHOqFic&_lH$6~+DCIo!fVFZa^RXukd`;$!EL zs+U-SYK&8Gw31GQs*-$`NS+#l{mAd$fq_qd0_od!A+mgs@lG;F7={#+q22BJl1lH$ z06KfRFf~18N8{+w@j8j2;D|-LaCi5MWaBExtvfGM4TKIi*NCDZcOpDmSLt?LJ3m}w z;?N#;yIzfth?0nq{Bmnk+x>BN-wouKNSOO0O=+i}q!gN~A=rDRj3VsQk_A$Ua3bi;~7a;OpfCP`;KL6WSqEagy+SWc>1cf3%v(S4nr zndEzRBcEC`=|WSitQ1OA?XKO4g}L4Mo07T)1E(mF2VNC?}>7(G)-5X>7P3 zku}TdC!@x2gTElHmI{r0s*JNP#IqUbn71Z7v`xm1mCkG$MEn*<6qQ*t=S4|Xt+d&5 zDvM)yX;(p*K|Wg^gi8F)Lf}=|Vgs3Gz#qHn62?|>FvCSlyvT#Vv&Hn#wvKHx|ID5= zbi)_c3Y9+Sp;HZ1hAeG?t?;TCUxED5yOwfaIkI@#Lx#Y-P#H77%;<`HXXfE?Jy7ZO z@Oa;#HS>~h+M=h zZ3l^G=f2mF*#8C+mo6YtSulbs@ht%!)t6sl2^85#>X;Z?|MtM$$lP`d$Sjxv874%- z5J7_>;cth~Q+Rif6t7yl+Q^*Fd(=6XZmM0-)d~GYf)PFw+R2`jNX#p*ykaAt+C8oF zJ~iDeHzIgCEL|g)B4loqRbjXLDZP~ZbN7N87{yH^iEfjO{1#mJSEJqEe+Y7`O;U=l zMmv=c$`41zgzNFk*-@G_m3`pA0Xs`m=~jMd6VnHY_B7~yD9!o|s0h8j@2=7B_V=ND zaeDWz+n>36Dd}k%@D$b=8)=gXFYe8VxTwqqCM=IeUNns^6%Y@N%+bS8kyKF050zdG z?)vo=D?2-#Vrn$l;;K~fmD8#!Hs@;1~iLKXriZ-ed^)uJbX#efv+8mJ%;GYQhK zTeB<0xKU(?z}mOyowC$jc>#fIy#ncJCb!Hh*6JWF7H06b2w5>r;D;f6Y(7(ON_zcT zWCN&-sq?Ct30)-0+k zSKI zm~X|enI{?e`)hPA?^5DAM-xpa0w%2OV0jFCMwkJ`qLT3;LX+>?j<$bt4zj3$pLv z{FfayI0{2?)ReJC6CEiMoPX~Ya-(xSbwIjCKt&iu95n)}XKLWC7tX#$l11o5mPI`E zg(649Z#3HTQ&661)L5gQ?pUnXUw_>`wW&N-9NjxnJ!p@!)3=uery`o-WifN3oC?)V zp=ugAD0Pmg1bVX=Dt!X{-iF^kA-5pmXCjVxxg`H23s zO02;ZsupVvNol&P!`6ug4C|E^qymv%U>oE^QJ3l}cnI7Sl5EqOs8L|n*hn`!JCIzx4A~uLwKyt`IPFDI zrvR+Q5|~5=uUweMt0c396>E{d=U$v+L-x%4EMA|V!x-&Wk{Kh7!I~^atXW60S;KHV zj@_9&9!Pg!_iPCrufB=;b1xxFlA9}*kg70EjVR(Gyle%EBsrt?3g!m7&~fi>bUyk3 zVtZ~zYj}XnQmJQi6(LC!QH<#-L9XddHBe2e25#EA6+3tAFw*hTOE2NAx8AZ5zj`?R z?$$k8!%T>{NC_e+dM2d<+V}0-hi9I7#*Qkw>#nf6yLv9tr)Sc;_+Aeb2aQVVt48bAt+UZteIE3+*Iu&` z+N?rJqrrklh-52EbAHOef13p#F%wIP*2x?5j23dpCzl2=j!Qxx1N z{Co#e?7$^@yO|26lkarq@G&$`oI(BkB{WEMYb3gHlFz|S>ujAPdvg~3Maa8FwnmLc zWEp-eOY$jul^V)A!b!(b5fnE@JVg+%#$pc1uh380v_JD+kS0{Yf%RAJb#c62`o-+# zjg*dPlQRG9fe2-2mr#^KCjqEwe-;?XhSrq_T@Bfw)S;3-aNxpQgv&5{%s*aTA0(Wt zv2v)HgdhCi2l&;meq}P?*T4QXe)hAU*({67o`=WvLdD9%<9&k;V-dMRo#dfLaz|~x z3iK{Sao6A=W+=c4C(a>WY$92sh-5>cDLY%Y#^PCTM(x<6WZwV=Z`y+Hom=tJ#5n%u z#g}p7a*0B+mu*cCC8S0d+3@JweMu6+S`$^|P>l_unpuTb?>e;lSK@p@N4+EwYmk62 zK9PnR#42KJs6`WdV<~LQcH^OR4|bfNLj3XPQ2zDv=%1QLH*G}95oDWbWU48|%5lWv zX(px%k?pIIe)v{I9=-*YovTsqXV~$G9Z{o`RwS0o^gkTbHDPY+@+hzqY>76Ka6S6z zPucYA%P+r-zy9mLHj*b&A))UGh#<1z?nN{l5fSlJqwwc{{^vG2q3^rjefQlqqN))# zP4S9^iGbaC=bbhh_~esM+UTN)-aCz4IFh50PLZR>9(&9-#%$ia8QZsSw^2$57hgw) zHtNo%q0V%V)JkYDGU3uC#I^eT9{Iau#^~C}y5|2@`J|KyhvwwR9AT z)kExQt^sl#B%XCU&|PPI#xtp4&1Xt$py`qPqmq|Osx|^ySY{GK=g=@ZS1dzRBbC(} z3TH{oU)qPpnG1+kNjy^-#PlUBjeOd;Ak!Oe)-gY+T=biI_ZoTa*1Av14CN)$U;y|) z2fyT#vPaX^8j;jlnvNtoD2t@p>7dgEcUP{4#Ru{wRD2J57r~MUJ-Y&tPMsnUrOb=y zKu_%!qFy7d3C1(QxFuRT+=?=TDiV=YQRmgVw^ZuTGC;9K4Smx+eYE8iHpr^DC>qQf ziAmF2B!X1w->lHG$hWeceE+AIJ9G;5$$8sdsUu=c9;-p1uv4Sg$RyG1?L=z* zN;FrE;Psg){QRv0I9sS-o|3U#Vxz{EA{M7THn^gB@m3u@u_!hVEywD400zG@5lQ=Ldt$mkmNO2wC3AQ%)qyo6-M?yrlGz#(E?|#?T zNs4Iw(I5ShO*4zIh@41?z-XlHi(mYrU7vX3iAAC#znq<`$&KzsIDherUzi(_xI6B+ z!$v7ZT1A2#Nb8$# zzG-=J-+lMlx8mJScZ(DM7e{~eUU&)C#GeE<93$G+G0*>Vc`9Bf7j$%pQl z2yJGG>Y({5Rf%yaki^VOvHlcECPflWl@Tjd5HD2`)$vC9Oy+zEn4_AZx-<#wdkclf zevNbA{Siig{UWB%UPOWAwcMG;(C)2>vEDL4^ryy-mg2#>njneHXM#~m%iuPp3$HG% zBEk`UV}1qeSU!tHgXx_r;L^*lqdGPT9kGOguKiEfWR;2;`CdBcik^-bvxy;4~A zWheTnGeLEbeVu{TShuwq3N@xrOMNWAf*Na)F{o6?BPyHDCKlstl8s<~njQC?SC{by zYOLTa8W6N^Msg#K!WC%@$)~)K6}~fO3h!kvRB{t`F3ca3MeNW1?9cv9sQ35~ zL&8|2Q`$7KlpvBN;%S1kMzVNm0i%0Q;lShjFn-`PVr=+gbvB3;auTEZ{G86o)Cfg2 z$@XDc7xLRyV_|teUMtSwiQ~s{a<+i7z9vGUs>viuOa(+gnn=eQ7*5A<*YZK!Jv@ZL zVhN>_XHYnQ0nthoy*<5%bmuVND5J#2M&EwVF>kfGXivTapKK+t?!;MSUfzc!8~)tX zIMS7(5n3(wx9=UZVW^OV7Q4Gq*{}hvd-mY;whefiDR{Y3#?f*Gvy4+RlSM~118v8# z)t)sr`i!SFfY#Wsc@$q({!pbeY4r8?*(RRR(F@rB#+x{-^=hd(s(^r=sM%9KVat7I~PT|0N0KQX3F{>WZBov~#D8d=dOu9hL3I>q-`DDXM+GaSj4eTAvCXyi|1 z^QS-ksl`>JfLcHL^{;>3Mp8xU+o#;EVP>J5oSwqd&p(UV;ygBO-iU46wjj%QXRoN* zz#IEsvwZ4i-MjU++cC_}hTfOTtPXTn@eAS|iIRdI(#$ZneC2 z_7o=(Q014>c%0>2cD1%v4ZQ5Of96kCZmw8ngy@aV3_F;^~vGmMdl%9PV#TWNt?&Vi7O*Ql4%b0(WWdG$? zF{}F*UP1ABsux~Gf%=(eUc}^+&tmGS7cjqfKPv1*HZD(F9gYq6qWk787`cBB5*s%n za^W)O4<1ALyuQC4L4MT=bliOluwuZ-qAf$Qf4$2v@APh1&WteeMJ({$7FaKnP#l}E zXR*FK`tI6gyXY@J_ZsS#NZyla%AXPR?4-Zzm)U5joLjk3gc)ypef-hIN|nf;?i470 zWHr)cC7&;%eDo9wM^B?RT|ly<6P+8^BDZl3dmd@D^zHgXC$MmC3=KL;vW)d?XSi!d z7!NmnF3*@AmOaTmC;L>!^i+je9b1hKV|)e+ZyrWPpB`N(89DFRu@&)ktAT9FP8?8L z?1fomsbPLMnf}?=-bDHMdDIuGwrrwf>jtFPEXOPf`o4n)ZTX7onmRmMORkv|Cuc-L zml8BvBpKsmg2#=6C!b3MOO<@8HPO_MhX2Z!OBmgE28W;6j|*>}Mxw|9SeIBOp(9CE zBcyXOD-@uO6v<^z7Tq_k#lmnGUYnoAQ)kZO$kZ%Kbkm9^=`{rgg@)R$XrzI3w1I(i z6uXD|@ZjAbE8K3&XYiB z4WO=P&zvP`J7vT|q~n*5|I$VyHR`FxK-0_L_{KME3b*}uC3lq)0n;;;C9UDo^u9(| zHDW5Fr)gX1MYvvl^;KIxsxUN-T_?Hu^rt_K&wu{&*s_HrO(RHGLDTtK4<^4x*of}F zc{e)s9d9+9EXTz{(a4p;5Q!97Ub|*3(;qW3Cq5@)+11ra!q{)|70FV3G`e#3>=_%W z6*1FQBvbL!Xs6=&+;h)aqauI5@|CaPfd?M2b$7lEnLkBge6z9p^gaT_d7=PYHJVx^CN!frsuwZueG1 zNU|0Voy3%g)z~Cr>_Fw$uSV{!9l#J}S%Mu+$q3Z}#V+`_a-b}={FV41A+MghgvOc6 z$ds9K?%jy$m?inAPZ}b{t$`h8EC36#uhnj;5WpGrOm^2g!5_m&eC&Oe0~357`Ld>uwLPs75$NYBbs=k|#1FLMMWw zFf}r&I6eC4qZWqNdb$x(`K5QLaHKTyDPpNLVVXAIwtX9N+V#xz%B~u#Q4&*)p5)np zZQHgLYgVrb{gIE%bLvIF^BsANut6IbAPFTQoncuxeL5h<8eLV~lm}W9s#5|)oRubx z`YN89ZrAbxHJ0+zd}kmQU&crIK3AB-LFTOp-=>Wlv32tno!{>Sk$mN^NTjCMwZW+U$S1j1-id%}RN8Ii(mT}1vk0~b zr_!r;uQZFyip1;PY5naNzVHPbRUIA~#-+>S*iX9}aow81@SV3!{j5<|=N>lQ-Yh6bsRl}ooQmi5QEMfya z$ZT4Jt~++3=Yc)Q-+B`;($CC}Fq{(@J8}}U)3a#hGRSRNgU&nne4xt+s|c0y+TMq~ ze`Y&Lzef2jTUl448kL)w$IQv|s4$*Y*4aXmWNi5WdT!rA!n+e--EYQq09ruSL;&Sn z1E2v9Wru_Lsjog^dI1wBPGgGiqu#0`-qnGjjqBO@O=9v*lEA5XJNq}aViIIMf)ubUu)J8P*0Bj57$=-9VD9)yOrAK0;(QUYZjF4dC$ZaTBcJ7q zmoRnY6lO0^nv97s@A|iIL~ISor!6IrpH$2vP3}vp#T!A#J0zdsUsT_qpPa>|w+^8| z*-&ZLkytipVQB;tdl!n|p+!#;lSFlI?UOO+~;?8tX*+kpIr;OlG) zEFbDr3hL0Qe5xKxX5DhjEpMAOSqkvv^MivYpGyQwm3+2H`f7zLPCWe<4*v303bylz zYLKKAM}tDrrjaQGllpElg=kfy5dEDPylp!gD~Iv?`3rdF_*tBqsiKS=g>IUTwNW6B zcq49&QZ!ycZ+8?sSN7wyG+SW1^`vji~+Z@BXfhc)F=}BOjq(?O~{_>R$fIt%#IHOEj{p zwRmbE8%#?!m&M9eE3tuT=qI_fhLg{w@TjU+fLgtj?EKZ`5qmM&xt($TGgOB%iTCqT5on zf(*l4vwj`cY*>%(p6;;0=VO*XYN>+8%e}v=p*RR?q%|_>*5W$*il6jSZYopnMQIS} zSA0d+3~y`5@x! znGTZ4o;z;F@WXeZ=b<~0+(AOs)4@z;KD1)&08WtPO<kPCoD4wHYn#c#pCJ z8P)O$l2FA>gh=^GMr0e0Y$Q=@h#Z*0E*FARgYa88^k#IQQ67NF19$mV`BBjhNON>f7lN zhDkD+izB|i=mZylGGCzf8v*@9(W5w6#n^z8nR82fpWu0NhHGtG~U8ow1)iF z4d}i1E>w2jgy(Wee0zElug)!?9?h|hNg_dFO!1G3rKpZhlFhAb#2(qO7LTl3W{2vh zB0363J5@D0ld?A2+5jrOX9;y9jUsFO6S=C^tC(Q}r81y1lf1-Z8vvj?%ik;kFEAJ; z*@BUty;u6hi0~b>#->r(djJy$k6`lBC1kt1FtXcug9$41H{w{qD zM>K8f+cGDpx2CgfQlw>11_Cw8TZU0Tb`q7-qi7aNB=;RiuVHvAmj(GoB3wIh29>c1 z`&wGOzZdyUYk(Dl%zuWU{8717zJ^NBugIp+;D|~lVfvs6Lxz!5Z0kK5@4Np?n(8`#-gwVVQnIhsmZS=2HT z$qJP_$p>|oRlZgCmlCv$MfGQ?#rvZGPd=9j)KD);@_D+7AN=KaacSQfBqk}_OEJW1 z6r!;>3OetDq)rFBx8fvfE4r}mj_p{rXE#n#82 zTHTA)t9#IadCVSp9rFj?#K81Cdf8TF>Lh1sxY+*GvoXx(A}Foy!}?D>gwBT^M19R# zyjCvZ+b56PTGR;*up*6kG|k2%3f{8uBAJOck*k)ltG5&XeAiaoyJ84~X*IWM5+k%r z0uzoxgo7!IP{jTm`5ZT>S3j$Ask_I!0_QZBAi&djA(O77aztbEs1W@97nu>_yNG^7)8!i)V|2XeACFJ z#X2bqv{<5ednnW0*9NhNw7#8WExHKq7c!yL6*ts6z(J=eF=(O`#>q^+gAR%FPo zBT2?pd8d5iJJniTl{*_LwdW#xia0$n(kl%g^P;1$^ryAU>KoV-MMQ~Kf@@T)$1QzJ zpLK_okLgHJ?j=xWMzD12M7qVkhQ(aV52$OE8CUgh6_7f>N`HcJVg0kDg!Nufxf8C{ z!CVUP1vUcy^1yn)iidBjT*BpOM|Q*E>$L1PO+?nOr0LdUWW zY`9|!wmoz+vg>*g>!Y2{PK;^yB~`V&K!I4K`!ez*tQ4W>?1*B=uJzcoa~*1l8jhbk zjs^*B4~0p0B!Nb;j0#n)DpAX@DIgn7HqsQ(8o!Dzl#pB~ql>-yp}}5u>f-O%+rtAQWXsn+!D!gL*$SR zi>B9V3{TR%TAaf`CWYayPIT#iT4>`7mk$Oisv@2Xn_rbcj zw-dc~0w}nvBQbi`9)=ndXD%f{Y~fHjJI)VBeB6CIuC}YI^HYkUFa9}u((B){LT1v~ z^Y;5dudsEMUxKbKo`RkUE}c%9KUC7o4?)xUBD=Z@=2qEEBB{5bU)u;H0urhqcNJq1 z1S(D8T9En)!nhWkx#H{M;mo9WP~2ReJG&0j>zT~m`*F|P?aPnp=_$PU(hE3z@DPRv z2Jzs14`4ORtmUQLNYTDVC?htSMG}-@XCob`CY44u?GSj~hh$OaQZ1d&sSSa=Hb_e9 z%F8I9vn$f+@GKwbe-Lkx&mit1dGC{JF4{T&qtsu}&NxMvOd%>0@U~o3Ru}y&);v*u_7~YxA3maf;Heb1On` zqpe~2R9SOnSY=W7dL||PQi7j$|KQ-s=MsS`_EIFDmws^)=MJAieYS#RGl6)Eq>Oy5 zPNA35RB^I}t~K3Qcjrc|yK6H#Hx44A?{H>g=<3U1aJUbBU3qj-c6KM480?H=^-w1^ zZy3gX_uYieH?Ku8Uc=FeQJgPKV@f;NGih{nznU3?aV+XUE*MJ$G#|K+C*;Czzjv;^N}0 zxajJhwc}c5g0pY=5~g2Q=dZ4Z4j;tRzkUjnlM~pza~JNt>mKy<_S0PuSBt2;XPlKj zjiTA+8I=c;6DhYj%vh7c6tUDY7rloty;`SvCGE6By?vdhLFMvMpx?H}+5Dkh#hH4Q zUE9FJJk%wKleu6zWS6(fa++Cqp*x+75!FZ)Ns>BvI+iV1H>$WW9a_^VcjoZQMZb2- zAA7G>27(%-C${-USBoR{_JRX9x|%(^37~sJXr_zIG!iMLK}Z{YRa~qL$^vbOXevLI zK!wL&dq|~Cjdl>e(yI7b+Ja}6QL@U%!EI1}0!Yt`enk2$Uz~e|BPql8#WX5T>hsGq z_?l9XUyF)<1n*QTh-ct+5Z0A26;1i__HwDX1DU6-DfLftU zfh^${M?>o=CD7s&wwV@2wvJ%!U7OIiWdzY2g#d}B1aKxD$8diqRu6V!-Lh_MUOj-D zHZ8~Qn^xfVn^$AYj+LmVfJ0;Fad`3)rYV5uNGeOMCf%mc+0lUng{#&s*_T-AHHu#m z9tui|(^xYO9l^IyZ=jw{pl`!!^xnJ)$*pUV-nId`om zoPu5=&jh=4BFHBAodBnW#Ri5~`wI}b34YCvyQf_dhkz*Qmg(p7cB11N3gK!3q7cLc4pX1es~Kzm8veecwLx zba&ws4?TpPJ8woZp=r^;o_<}tgH$Jp$)&lYU1z=BDXp4YQ*!4XhD0pFIw(@aT1I2}8TjW$@)V5h+PB$>zz?$= zT%A95A3kH>$B3SwtJBM#E>7_$eDZeCy#*^jc{RUvHN_i?j})bl)lo)AKeEAplN5X| zCHdmst(2_E9}9rEQorpIK;Fn-8fr3J?rdY6<(NIzgZphaJU^qA6sP?AKsBWoKv5R0Kk;;9Wqn%-~mT5D7h z)AS@A)R;a-fetC87d@d8cy)wBB3uH|?x{p5t#PM{(Og%vM3^1kw+sG7f7;AtCjBCj zy9TcH{Azu>dMD_a^XG~^UV~^EWE!mF44zvWH6q0OAW2Ls^Hb^y-cF<)elx59Zko_R z&utequZoJwqeV;ZOwrKd7(`UJii~_vEJQpla(ZF|$Uy^rEx32kj(5uY_V*=yyK0B- zuQkdfa}iIS#rpC~FI!&TvU4|fY}fd-@4(1Fz+W;;(D)CIYe%!Udsg==O@? z6}Y#kVr?Uaj@{6K{0qJs6u2|O6Z)l#*`o@L0y9R*tS@G*nOZ2C64pc2L)#^uLdmZ!exE}Zt~otbO1un7WtIf4BU(pavVs0|6Ws|NgA}X_E0h+nP$P+D zN!Hpk9RgpDr*N!L!kdM8T?6_ckg zqdZ$?gTTfuNz$yd9@#4nNGAgbrLZcEgz*AzFEtuCG&_SgPMyT))C7to)J90-8rcY^ ze5q4=m`o&?4NM#L0mTaZbFe8gM`S{CBVKAy)vC$Nl$yCf=sUr$b}rcXBE|6A$ceM# z8VGk?blYa{YB%m)xRzemYw52>kXA<0p6f2S2CX&YWa-vDpHON1O*wsqgqgM92;*8| zUdztaX%T`vlsQ#k6o5Ax^$fKZM{x)d&xo-FnJR9&2KL_Wft-X9ZbN(cSLeHXCvvCV z?K;XvCk|+~LuJV2gW&E3t=E-Z9k#FU`hV|x-@}#SJH9dWidzC|8lxD>-h-c`|c^E?Pu)R#T>peVv8&sq` zJl;3tR`sG|c@N_GB=ku)?H(^Tt0*_h$mUZ>P}nu*>KH$I31?q9iP^*BXiif^QyOdZ z6SiBkLit!lJXA?G3u%hnxTe@-M?;C)NF-qxPoNTwVU7gzRJn||%JVqi6-RXYYUH=C z!3+s(EfKZzL^VRG#z7*pUSlI(3^xvGTfAyUxRX~?c_!k;8Y##%f?1)OYBX_ZZXQpO zJil`MBreR%kOc}RY zexU>CW%rxk{3iaF|K)!%z0Nz;Ve|TmQYw?RG}>sS;>jo**su3uF`3?1JJ$^ zsZg2wP_LqCq(o*irZasyHrOI#w2y}LU(bU|O2wNm=1=%vhqoC}O(LtL`m{UVW+f%C=`pW1tpl3o@9$Zoqk`Qzd7Ucn!= zv_w#^FVUlxF10ZF+HpMdohLAPY#ga3iCCQi)<%A)(G+!)iqbOKmBq-GHQ4p3+cEUu z8k=`-MXPM&8X-T^XkxH#v`is+rVRY@@Cp3%&_TR4N8*>wp-3;IkrdLkC{nd1x??SD z?8@V|Y&SMek@UWP95Zj7MUEb%?HnadkXM0h3;ET(*!`vZu==izNcLxfo%jqfN|I^g zAdEvTl0=D-8D}`JjZfRR=3hBCinAoH)uaw@4tA5;H

MB=0i3j!?LNb=OXOdedrb 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 MVzA;Lo5qR{~)WiQ`o@>`Hp2;O%B>D)Srfn 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 W34y!RtZDy#lniu?wVPlrvHt-iEp=Z2 literal 0 HcmV?d00001 diff --git a/docs/_static/user_results_icons.png b/docs/_static/user_results_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..54f569ae14c21f3a3844b1bf7d653943900f8559 GIT binary patch literal 12038 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 O(v{w-%hkRy5B(pLs%Pu~ literal 0 HcmV?d00001 diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 00000000..2773030e --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,31 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'buildingSMART Validation Service' +copyright = '2024, buildingSMART International' +author = 'buildingSMART International' +release = '0.6' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [ + 'sphinx_rtd_theme', + 'myst_parser', +] + +templates_path = ['_templates'] +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +html_favicon = '_static/favicon.ico' + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'sphinx_rtd_theme' +html_static_path = ['_static'] diff --git a/docs/dev/functional_parts.md b/docs/dev/functional_parts.md new file mode 100644 index 00000000..1345d7b1 --- /dev/null +++ b/docs/dev/functional_parts.md @@ -0,0 +1,35 @@ +# Functional parts + +Functional parts refer to logical grouping of rules that involve similar types of validation. + +These functional part prefixes are used in the naming of the normative rules +and are reported in the results listed by the validation service. + +## Catalog + +| Code | Functional part | Gherkin tag | Notes | +|------|----------------------------------|-------------|--------------------------------------------------| +| ALA | Alignment Agreement | @ALA | | +| ALB | Alignment (business logic) | @ALB | | +| ALG | Alignment (geometry) | @ALG | | +| ALS | Alignment (segments) | @ALS | | +| APA | | @PSE | | +| ASM | Assembling | @ASM | | +| AXG | Axis geometry | @AXG | | +| CLS | Classification reference | @CLS | | +| GEM | Geometric representation | @GEM | Shall be further decomposed | +| GRF | Georeferencing | @GRF | | +| GRP | Grouping | @GRP | | +| IBP | Industry Best Practice | @IBP | Used for @industry-practice tag | +| IFC | IFC | @IFC | Validating correct IFC Schema | +| LIB | Library reference | @LIB | | +| LIP | Linear placement (non-geometric) | @LIP | | +| MAT | Materials | @MAT | | +| MDS | Model setup | @MDS | | +| OJP | Object placement | @OJP | | +| OJT | Object typing | @OJT | | +| PRP | Properties | @PRP | | +| PSE | Property Sets | @PSE | | +| SPS | Spatial structure | @SPS | Need to split SS aggregation and SS containment? | +| STN | Stationing | @STN | | +| SYS | | @SYS | | \ No newline at end of file diff --git a/docs/dev/gherkin_deep_dive.md b/docs/dev/gherkin_deep_dive.md new file mode 100644 index 00000000..1050eab0 --- /dev/null +++ b/docs/dev/gherkin_deep_dive.md @@ -0,0 +1,9 @@ +# A deep dive into gherkin rule implementations + +TODO: Ghesselink + +## Decorator + +## Context stacking + +## Validaton Outcomes diff --git a/docs/dev/ifc_gherkin_rules_readme.md b/docs/dev/ifc_gherkin_rules_readme.md new file mode 100644 index 00000000..ed24d942 --- /dev/null +++ b/docs/dev/ifc_gherkin_rules_readme.md @@ -0,0 +1,61 @@ +# IFC Gherkin rules + +## Usage as part of buildingSMART validation service + +This repository is one of three submodules in the overall validation service. See (application_structure) for more information. + +## Making changes + +The rules developed in this repository follow the general ideas of Gherkin and its python implementation behave. + +This means there are human readable definitions of rules and Python implementations. + +A third component of this repository are minimal sample files with expected outcomes, which means that extensions and modifications can be suggested with confidence of not breaking existing functionality. + +## Command line usage + +Informal propositions and implementer agreements written in Gherkin for automatic validation of IFC building models using steps implemented in IfcOpenShell. + +```shell +$ python -m ifc-gherkin-rules ifc-gherkin-rules\test\files\gem001\fail-gem001-cube-advanced-brep.ifc +Feature: Shell geometry propositions/IfcClosedShell.v1 + URL: /blob/8dbd61e/features/geometry.shells.feature + + Step: Every oriented edge shall be referenced exactly 1 times by the loops of the face + + * #29=IfcClosedShell((#104,#115,#131,#147,#163,#179)) + On instance #29=IfcClosedShell((#104,...,#179)) the edge (-0.183012701892219, + 0.683012701892219, 1.0) -> (-0.683012701892219, -0.183012701892219, 1.0) was + referenced 2 times + + * #29=IfcClosedShell((#104,#115,#131,#147,#163,#179)) + On instance #29=IfcClosedShell((#104,...,#179)) the edge (-0.5, -0.5, 0.0) -> + (-0.5, 0.5, 0.0) was referenced 2 times + + * #29=IfcClosedShell((#104,#115,#131,#147,#163,#179)) + On instance #29=IfcClosedShell((#104,...,#179)) the edge (-0.5, 0.5, 0.0) -> + (0.5, 0.5, 0.0) was referenced 2 times + + * #29=IfcClosedShell((#104,#115,#131,#147,#163,#179)) + On instance #29=IfcClosedShell((#104,...,#179)) the edge (-0.683012701892219, + -0.183012701892219, 1.0) -> (0.183012701892219, -0.683012701892219, 1.0) was + referenced 2 times + + * #29=IfcClosedShell((#104,#115,#131,#147,#163,#179)) + On instance #29=IfcClosedShell((#104,...,#179)) the edge (0.183012701892219, + -0.683012701892219, 1.0) -> (0.683012701892219, 0.183012701892219, 1.0) was + referenced 2 times + + * #29=IfcClosedShell((#104,#115,#131,#147,#163,#179)) + On instance #29=IfcClosedShell((#104,...,#179)) the edge (0.5, -0.5, 0.0) -> + (-0.5, -0.5, 0.0) was referenced 2 times + + * #29=IfcClosedShell((#104,#115,#131,#147,#163,#179)) + On instance #29=IfcClosedShell((#104,...,#179)) the edge (0.5, 0.5, 0.0) -> + (0.5, -0.5, 0.0) was referenced 2 times + + * #29=IfcClosedShell((#104,#115,#131,#147,#163,#179)) + On instance #29=IfcClosedShell((#104,...,#179)) the edge (0.683012701892219, + 0.183012701892219, 1.0) -> (-0.183012701892219, 0.683012701892219, 1.0) was + referenced 2 times +``` diff --git a/docs/dev/index.md b/docs/dev/index.md new file mode 100644 index 00000000..3e3e42b5 --- /dev/null +++ b/docs/dev/index.md @@ -0,0 +1,21 @@ +# Developer Guide + +```{include} validate_readme.md +:heading-offset: 1 +``` + +```{include} ifc_gherkin_rules_readme.md +:heading-offset: 1 +``` + +```{include} rule_details.md +:heading-offset: 1 +``` + +```{include} functional_parts.md +:heading-offset: 1 +``` + +```{include} gherkin_deep_dive.md +:heading-offset: 1 +``` diff --git a/docs/dev/rule_details.md b/docs/dev/rule_details.md new file mode 100644 index 00000000..552c71f1 --- /dev/null +++ b/docs/dev/rule_details.md @@ -0,0 +1,489 @@ +# Detailed Information for Normative Rules + +Follow these steps to add a new rule to the Validation Service + +| n. | Step | Responsible | +|----|------------------------------------------------------------------------------------------|-----------------------------| +| 1 | Create a new branch in the bSI ifc-gherkin-rules repository | bSI Validation Service team | +| 2 | In this branch, start developing the rule needed **following instructions below** | rule developer | +| 3 | Create a pull request to further test the rule(s) behavior using the sandbox environment | rule developer | +| 4 | Assign a reviewer to the pull request when you think the rule is ready to be merged | rule developer | +| 5 | Review the pull request | bSI Validation Service team | +| 6 | (optional) Fix the rule according to feedback from reviewer | rule developer | +| 7 | Approve and merge the pull request | bSI Validation Service team | + +## 1. Branch creation + +In the buildingSMART [GitHub repository containing all rules](https://github.com/buildingSMART/ifc-gherkin-rules), create the branch that will be used to develop the new rule. + +- Name the branch with the name of the new rule. Example: `GEM900` for a new rule in the geometry functional part +- Add 1 rule per branch, to facilitate review (1 rule = 1 `.feature` file) + +## 2. Rule development + +A rule is considered complete when it has: + +- a Gherkin [**feature file**](21-write-feature-files-gherkin-rules-for-ifc) +- corresponding python implementation (aka, [**python steps**](22-write-python-steps)) +- a set of [**unit test files**](23-write-unit-test-files) + +Below are instructions for all these 3 components. + +(21-write-feature-files-gherkin-rules-for-ifc)= +### 2.1) Write feature files (gherkin rules) for IFC + +A feature file is a file, written using Gherkin syntax, describing the rule behavior. +In the branch just created, add a Gherkin feature file following these instructions. + +**File format**: `.feature` + +**Location**: https://github.com/buildingSMART/ifc-gherkin-rules/tree/main/features + +#### Naming convention for feature files + +- The file name is rule code_rule title +- The rule code is made of 3 digits capital letters (taken from the list of [Functional parts](./functional_parts.md)) + 3 digits number +- The rule code, and rule title, must be unique +- The rule title shall have no space and shall use `-` as separator + +

wrong + +``` +SPS001 - Basic-spatial-structure-for-buildings.feature +SPS001_Basic spatial structure for buildings.feature +SPS001 - Basic spatial structure for buildings.feature +``` +
+
right + +``` +SPS001_Basic-spatial-structure-for-buildings.feature +``` +
+ +#### Mandatory content + +`.feature` files: +- must include one and only one of these tags to classify the validation category: + - `@critical` + - `@implementer-agreement` + - `@informal-proposition` + - `@industry-practice` (warning; not a pass / fail) +- must include a 3-character alpha tag to the functional part. See [Functional parts](./functional_parts.md) +- must include a single tag indicating the version of the feature file as a 1-based integer + - Example: `@version1` for initial version of a feature file + - Example: `@version3` for the third version of a feature file + - Minor changes such as fixing typos or re-wording the description do not increment the version + - Any change to a **"Given"** or **"Then"** statement, or to a step implementation, requires the version number to be incremented by 1. +- must include one or more tags indicating the [error code](error-codes) to be raised + - If all scenarios raise the same error, then this tag should be placed immediately above the **"Feature:"** line + +
example + + ``` + @implementer-agreement + @GRF + @version1 + @E00050 + Feature: GRF001 - Identical.... + ``` + +
+ + - If some scenarios raise different error codes, then this tag should be placed immediately above each **"Scenario" + ** line + +
example + + ``` + @implementer-agreement + @ALS + @version1 + Feature: ALS005 - Alignment shape representation + + Background: ... + + @E00020 + Scenario: Agreement on ... representation - Value + + @E00010 + Scenario: Agreement on ... representation - Type + ``` + +
+ +- must include exactly 1 Feature +- the naming convention for the Feature is the following: rule code - rule title (the same used for the file name). For the rule title blank spaces must be used instead of `-` + +
wrong + +``` +Feature: ALB001_Alignment Layout + +Given ... +Then ... +``` +``` +@ALB +Feature: ALB001_Alignment-Layout + +Given ... +Then ... +``` +``` +@ALB +Feature: ALB001 - Alignment-Layout + +Given ... +Then ... +``` + +
+
right + +``` +@ALB +Feature: ALB001 - Alignment Layout + +Given ... +Then ... +``` +
+ + - must include **a description of the rule** that start with "The rule verifies that..." + +
example + +``` +@implementer-agreement +@ALB +Feature: ALB003 - Allowed entities nested in Alignment +The rule verifies that an Alignment has a nesting relationship with its components (i.e., Horizontal, Vertical, Cant layouts) or with Referents (e.g., mileage markers). And not with any other entity. + + Scenario: Agreement on nested elements of IfcAlignment + Given ... + Then ... +``` +
+ +#### Mandatory Given(s) +If the rule in the feature file applies only to specific IFC version(s) and/or View Definition(s), then the feature file (or each of its Scenarios, if it has more than one) must start with Given steps specifying the applicability of the following steps + +
examples + +``` +Given A model with Schema "IFC2X3" +Given A file with Model View Definition "CoordinationView" +``` +``` +Given A model with Schema "IFC2X3" or "IFC4" +Given A file with Model View Definition "CoordinationView" or "ReferenceView" +``` +
+ +#### Optional content +`.feature` files: +- can include 1 or more Scenarios +- Scenario titles have no constraints +- can include the `@disabled` tag to temporarily remove them from processing + +#### No spaces between steps + +
wrong + +``` +Given A model with Schema "IFC4.3" + +Then Each IfcAlignmentHorizontal must be nested only by 1 IfcAlignment +Then Each IfcAlignmentVertical must be nested only by 1 IfcAlignment +Then Each IfcAlignmentCant must be nested only by 1 IfcAlignment +``` +
+
right + +``` +Given A model with Schema "IFC4.3" +Then Each IfcAlignmentHorizontal must be nested only by 1 IfcAlignment +Then Each IfcAlignmentVertical must be nested only by 1 IfcAlignment +Then Each IfcAlignmentCant must be nested only by 1 IfcAlignment +``` +
+ +#### Watch out for extra blank spaces + +
wrong + +``` +Given A model with Schema "IFC4.3" +Then Each IfcAlignmentHorizontal must be nested only by 1 IfcAlignment +Then Each IfcAlignmentVertical must be nested only by 1 IfcAlignment +Then Each IfcAlignmentCant must be nested only by 1 IfcAlignment +``` +
+
right + +``` +Given A model with Schema "IFC4.3" +Then Each IfcAlignmentHorizontal must be nested only by 1 IfcAlignment +Then Each IfcAlignmentVertical must be nested only by 1 IfcAlignment +Then Each IfcAlignmentCant must be nested only by 1 IfcAlignment +``` +
+ +#### Do not use punctuation at the end of the steps + +
wrong + +``` +Given A model with Schema "IFC4.3", +Then Each IfcAlignmentHorizontal must be nested only by 1 IfcAlignment; +Then Each IfcAlignmentVertical must be nested only by 1 IfcAlignment; +Then Each IfcAlignmentCant must be nested only by 1 IfcAlignment. +``` +
+
right + +``` +Given A model with Schema "IFC4.3" +Then Each IfcAlignmentHorizontal must be nested only by 1 IfcAlignment +Then Each IfcAlignmentVertical must be nested only by 1 IfcAlignment +Then Each IfcAlignmentCant must be nested only by 1 IfcAlignment +``` +
+ +#### Be careful when typing parameters. They are case-sensitive! + +
wrong + +``` +Given A model with schema "IFC4.3", +``` +
+
right + +``` +Given A model with Schema "IFC4.3" +``` +
+ +#### Must vs Shall +Use **must**, not **shall** to impose requirements.[ALB001_Alignment-in-spatial-structure.feature](ALB001_Alignment-in-spatial-structure.feature) +"Shall" is ambiguous, also in the legal field the community is moving to a strong preference for “must” as the clearest way to express a requirement or obligation. + +
wrong + +``` +Given A model with Schema "IFC2X3" +Given A file with Model View Definition "CoordinationView" +Then There shall be exactly 1 IfcSite element(s) +``` +
+
right + +``` +Given A model with Schema "IFC2X3" +Given A file with Model View Definition "CoordinationView" +Then There must be exactly 1 IfcSite element(s) +``` +
+ +#### Verbs for IFC relationships +When a rule requires a specific IFC relationship to exist, refer to the table below for the right verb to be used. + +| IFC relationship | Verb for rules | Examples | +|------------------------|-----------------------|--------------------------------------------------------------------| +| IfcRelAggregates | aggregate, aggregates | Then IfcSite must aggregate IfcBuilding | +| IfcRelNests | nest, nests | Then Each IfcAlignmentVertical nests a list of IfcAlignmentSegment | +| ... | | + + +#### Reference for schema versioning +Rules that are applicable only to specific schema versions must specify +the schema version with the initial `Given` statement. + +For example, alignment entities were introduced in IFC4.3 and are not valid +in earlier schema versions. + +``` +Given A model with Schema "IFC4.3" +Given An IfcAlignment +Then ... +``` + +Multiple schema versions may be specified if applicable. + +``` +Given A model with Schema "IFC2X3" or "IFC4" +Given An IfcElement +Then ... +``` + +##### Valid (active, not withdrawn or retired) Schema Versions + +| Version | Formal Name | Schema id | Common Name | +|---------|---------------|-------------|-------------| +| 4.3.2.0 | IFC4.3 ADD2 | IFC4X3_ADD2 | IFC4.3 | +| 4.0.2.1 | IFC4 ADD2 TC1 | IFC4 | IFC4 | +| 2.3.0.1 | IFC2x3 TC1 | IFC2X3 | IFC2x3 | + +(22-write-python-steps)= +### 2.2) Write python steps + +The python steps are the implementation (using python language) of the Gherkin grammar used in the feature files. +In the same branch used for the Gherkin rules, change or add python steps following these instructions. + +**File format**: `.py` + +**Location**: https://github.com/buildingSMART/ifc-gherkin-rules/tree/main/features/steps + +#### Naming convention for python files + +For the moment, all python steps are contained in [steps.py](https://github.com/buildingSMART/ifc-gherkin-rules/blob/main/features/steps/steps.py). Therefore, **you should not create a new python file, just expand the existing one.** + +:construction: :construction: :construction: +*In the future, when this file grows, python steps may be splitted in more files - using a certain criteria (e.g., functional parts). When this will be the case, the instruction will be: locate the best .py file to host your steps and start adding your steps* + +#### Steps parametrisation + +When creating a new step, think about parametrisation and optimisation of the step for future uses. + +#### Step re-use + +Before creating a new step, check if something similar already exist. +Try to reuse existing steps. + +#### Do not use "when" or "And" keywords + +The "when" keyword must not be used. +The "And" keyword must not be used. +Instead, repeat the "Given" or "Then" as appropriate. + +Allowed keywords are: `Given`, and `Then`. + +#### Use of existing IfcOpenShell APIs + +Try not to use existing functionality included in the `ifcopenshell.api` namespace. + + + + + + + + +(23-write-unit-test-files)= +### 2.3) Write unit test files + +Unit test files are atomic IFC files, created to develop a rule and test its behavior. +In the same branch used for the Gherkin rules, and python steps, create unit test files following these instructions. **IMPORTANT**: every rule developed must have a set of unit test files. + +**File format**: `.ifc` + +**Location**:[ifc-gherkin-rules/tree/main/test/files](https://github.com/buildingSMART/ifc-gherkin-rules/tree/main/test/files) + +- in the test/files folder, create a subfolder using the rule code (E.g., ALB001) +- add the set of unit test files for that rule in this subfolder + +#### Naming convention for unit test files + +Unit test files must follow this naming convention: + +`Expected result`-`rule code`-`rule scenario`-`short_informative_description`.ifc + +Or in case where a rule has no scenarios: +`Expected result`-`rule code`-`short_informative_description`.ifc + +
Examples + +```shell +pass-alb001-short_informative_description.ifc +fail-alb001-scenario01-short_informative_description.ifc +fail-alb001-short_informative_description.ifc +``` + +
+ + +#### Content of the unit tests subfolder + +The unit test subfolder must contain: + +- all unit test files (.ifc) +- a README file (.md), listing the files and their expected behavior. Using the [template table](#table-template-for-unit-test-files) below +- where used, the script (.py) created to generate the unit test files + +#### Number of unit tests required + +- Each rule developed must have a set of unit test files +- There must be at least 1 fully compliant unit test file +- Fail files must cover all scenarios of the rule + +(table-template-for-unit-test-files)= +#### Table template for unit test files + +Example table describing unit test expected results + +| File name | Expected result | Error log | Description | +|-------------------------------------------------------|-----------------|----------------------------------------------------------------------------------|----------------------------------------------------------------------------------| +| pass-alb002-alignment-layout | success | n.a. | | +| fail-alb002-scenario01-nested_attributes_IfcAlignment | fail | The instance IfcAlignment is nesting two instances of IfcAlignmentHorizontal ... | Error is descriptive or exactly the error in pytest? If exactly, multiple row... | +| fail-alb002-scenario02-two_alignments | fail | The following 2 instances were encountered: IfcAlignment #23, IfcAlignment #906 | For IfcAlignmentHorizontal, IfcAlignmentVertical and IfcAlignmentCant | +| fail-alb002-scenario03-layout | fail | The instance #906=IfcAlignment is nesting #907=IfcWall | Includes errors for scenario 2 | +| fail-alb002-scenario04-alignment_segments | fail | The instance (s) #28=IfcAlignmentHorizontal is assigned to #906=IfcWall | @todo IfcAlignmentVertical, IfcAlignmentCant. As well as empty list/typo's? | + + + +## 4. Assign a reviewer to the pull request +... +## 5. Review the pull request +... +## 6. (optional) Fix the rule according to feedback from reviewer +... +## 7. Approve and merge the pull request +... + +## Appendix + +(error-codes)= +### Error Codes + +Error codes are used to classify and categorize outcomes from the validation service and are +implemented in [ifc-validation-data-model/main/models.py#L937](https://github.com/buildingSMART/ifc-validation-data-model/blob/main/models.py#L937). + +| Error Code | Description | +|------------|----------------------------------------| +| P00010 | Passed | +| N00010 | Not Applicable | +| | | +| E00001 | Syntax Error | +| E00002 | Schema Error | +| E00010 | Type Error | +| E00020 | Value Error | +| E00030 | Geometry Error | +| E00040 | Cardinality Error | +| E00050 | Duplicate Error | +| E00060 | Placement Error | +| E00070 | Units Error | +| E00080 | Quantity Error | +| E00090 | Enumerated Value Error | +| E00100 | Relationship Error | +| E00110 | Naming Error | +| E00120 | Reference Error | +| E00130 | Resource Error | +| E00140 | Deprecation Error | +| E00150 | Shape Representation Error | +| E00160 | Instance Structure Error | +| | | +| W00010 | Alignment Contains Business Logic Only | +| W00020 | Alignment Contains Geometry Only | +| W00030 | Warning | +| | | +| X00040 | Executed | + +#### Notes + +`Not Applicable` refers to a rule that does not apply because of the schema version. +`Executed` refers to a rule that does apply because of schema version, +but the model does not contain any entities validated as part of a particular rule. + +Both outcomes are reported as "N/A" in the validation service user interface. \ No newline at end of file diff --git a/docs/dev/validate_readme.md b/docs/dev/validate_readme.md new file mode 100644 index 00000000..578b778b --- /dev/null +++ b/docs/dev/validate_readme.md @@ -0,0 +1,158 @@ + +# Application Structure + +The application consists of three main submodules, each hosted in separate GitHub repositories. Docker Compose is configured to automatically bind the correct submodule versions for local deployment. + +## Submodules + +Documentation of the separate functionalities can be found within each submodule. d + +1. **File Parser**: A module within IfcOpenShell, dedicated to parsing files. https://github.com/IfcOpenShell/step-file-parser +2. **Gherkin Rules**: Contains the rules for validation. It can be run independently by cloning the repository and executing: +https://github.com/buildingSMART/ifc-gherkin-rules + + ``` + pytest -sv + ``` + + Debugging individual rules is supported with commands like: + + `````` + python test/test_main.py alb001 # For a single rule + python test/test_main.py alb001 alb002 # For multiple rules + python test/test_main.py path_to_separate_file.py # For a separate file + `````` + +3. **Shared DataModel**: This module includes Django data models shared between the main repository and the Gherkin repository, serving as a submodule for both. +https://github.com/buildingSMART/ifc-validation-data-model + +## Running Validation Checks + +The application supports multiple validation checks on one or multiple IFC files that can be run separately: + +- BSDD-Check +- Syntax Check +- Schema Check +- Gherkin-Rules Check + +# How to start? + +Depending on your workflow, you can run all or some services via Docker Compose. + +Below are a few common options to run and debug these services locally. +More scenario's exist - have a look at the various *make* files. + +## Option 1 - Run minimal set of services via Docker Compose (easiest to run) + +1. Make sure Docker is running. + +2. Start all services. + +```shell +make start + +or + +docker compose up +``` + +3. This pulls Docker-hub images, builds and spins up **six** different services: + +``` +db - PostgreSQL database +redis - Redis instance +backend - Django Admin + API's +worker - Celery worker +flower - Celery flower dashboard +frontend - React UI +``` + +4. One-time only: create Django superuser accounts for Django Admin and Celery background worker(s), for example: + +```shell +docker exec -it backend sh + +cd backend + +DJANGO_SUPERUSER_USERNAME=root DJANGO_SUPERUSER_PASSWORD=root DJANGO_SUPERUSER_EMAIL=root@localhost python3 manage.py createsuperuser --noinput + +DJANGO_SUPERUSER_USERNAME=SYSTEM DJANGO_SUPERUSER_PASSWORD=system DJANGO_SUPERUSER_EMAIL=system@localhost python3 manage.py createsuperuser --noinput + +exit +``` + +5. Navigate to different services: + +- Validation Service - React UI: http://localhost +- Django Admin UI: http://localhost/admin (or http://localhost:8000/admin) - default user/password: root/root +- Django API - Swagger: http://localhost/api/swagger-ui +- Django API - Redoc: http://localhost/api/redoc +- Celery Flower UI: http://localhost:5555 + +6. Optionally, use a tool like curl or Postman to invoke API requests directly + +## Option 2 - Local debugging + infrastructure via Docker Compose (easiest to debug) + +1. Make sure Docker is running. + +2. Start infrastructure services only (Redis, Postgres, Celery Flower) + +```shell +make start-infra + +or + +docker compose -f docker-compose.infra_only.yml up +``` + + +3. This pulls **three** different Docker-hub images and spins up services: + +``` +db - PostgreSQL database +redis - Redis instance +flower - Celery flower dashboard +``` + +4. Start Django backend (Admin + API) + +```shell +cd backend +make install +make start-django +``` + +5. Start Celery worker(s) + +```shell +cd backend +make start-worker +``` + +6. Start Node Development server to serve the React UI + +```shell +cd frontend +npm install +npm run start +``` + +7. One-time only: create Django superuser accounts for Django Admin and Celery background worker(s), for example: + +```shell +cd backend + +DJANGO_SUPERUSER_USERNAME=root DJANGO_SUPERUSER_PASSWORD=root DJANGO_SUPERUSER_EMAIL=root@localhost python3 manage.py createsuperuser --noinput + +DJANGO_SUPERUSER_USERNAME=SYSTEM DJANGO_SUPERUSER_PASSWORD=system DJANGO_SUPERUSER_EMAIL=system@localhost python3 manage.py createsuperuser --noinput +``` + +8. Navigate to different services: + +- Validation Service - React UI: http://localhost:3000 +- Django Admin UI: http://localhost:8000/admin - default user/password: root/root +- Django API - Swagger: http://localhost:8000/api/swagger-ui +- Django API - Redoc: http://localhost:8000/api/redoc +- Celery Flower UI: http://localhost:5555 + +9. Optionally, use a tool like curl or Postman to invoke API requests directly \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..c2ce4924 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,7 @@ +# Welcome to the buildingSMART Validation Service Docs! + +```{toctree} +user/index.md +dev/index.md +ref/index.md +``` diff --git a/docs/ref/index.md b/docs/ref/index.md new file mode 100644 index 00000000..1c99759e --- /dev/null +++ b/docs/ref/index.md @@ -0,0 +1 @@ +# Reference Information \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 00000000..100ece63 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,3 @@ +Sphinx +sphinx_rtd_theme +myst-parser diff --git a/docs/user/index.md b/docs/user/index.md new file mode 100644 index 00000000..6f6d65f7 --- /dev/null +++ b/docs/user/index.md @@ -0,0 +1,17 @@ +# User Guide + +## Introduction + +Data validation is a key component of openBIM(r) workflows. +The IFC Validation Services allows users to check the validity of their IFC models +against the IFC standard. + +```{include} using.md +:heading-offset: 1 +:relative-images: +``` + +```{include} validation_overview.md +:heading-offset: 1 +:relative-images: +``` diff --git a/docs/user/using.md b/docs/user/using.md new file mode 100644 index 00000000..c69fcb18 --- /dev/null +++ b/docs/user/using.md @@ -0,0 +1,45 @@ +# Using the Validation Service + +## Logging In + +Upon first visiting the site, you will need to authenticate with your user name and password. + +```{image} ../_static/user_auth.png +:alt: Login screen +:scale: 80 % +:align: center +``` + +You can create a new account if you don't have one already by following +the **Sign up now** link. + +```{note} +Your usage of the Validation Service is subject to the +[Terms of Service](https://www.buildingsmart.org/wp-content/uploads/2021/09/20210923_TermsOfService.pdf). +``` + +## File upload + +```{note} +At this time the service will only accept non-zipped STEP physical files having extension *.ifc* and no greater than 256 MB in size. +``` + +## File processing + +## Results + +### Color codes and icons + +```{image} ../_static/user_results_icons.png +:alt: Color codes and icons displayed by the service +:scale: 80 % +:align: center +``` + +Pass results are hidden by default but can be shown by clicking the checkbox in the upper-right corner: + +```{image} ../_static/user_include_passed_na_etc.png +:alt: Button to hide passing, disabled, or not applicable results +:scale: 110 % +:align: center +``` diff --git a/docs/user/validation_overview.md b/docs/user/validation_overview.md new file mode 100644 index 00000000..6c07df14 --- /dev/null +++ b/docs/user/validation_overview.md @@ -0,0 +1,54 @@ +# Understanding the steps of the validation process + +## Syntax + +The first step in the validation process looks at the uploaded file to confirm that +it is a valid STEP Physical File (SPF) in accordance with [ISO 10303-21](https://www.iso.org/standard/63141.html). + +## Schema + +Schema validation consists of two parts: + +1. Schema Version +2. Schema Compliance + +### Schema Version + +This check confirms that the schema identifier is one of the following: + +- `IFC2X3` +- `IFC4`, +- `IFC4X3_ADD2` + +### Schema Compliance + +The schema compliance checks that all `WHERE` rules in the EXPRESS schema have passed. +This check also flags any entity types that are not included in a given schema version. + +For example: `IfcAlignment` entity is only valid for schema version `4X3_ADD2`, +so it is not valid as part of a file with schema version `IFC2X3`. + +## Normative Checks + +There are two categories of normative checks: + +1. Implementer Agreements +2. Informal Propositions +3. Industry Practices + +### Implementer Agreements + +These are normative checks that have been ratified as official agreements amongst software implementers. + +### Informal Propositions + +These are normative checks that have not been ratified as implementer agreements, +but are still considered mandatory for a file to be considered valid. + +### Industry Practices + +These series of checks are different than the previous two in that they will only raise a warning and not be considered an error. + +## bsDD Checks + +These checks verify that all applicable buildingSMART Data Dictionary (bsDD) requirements are met. From 15a0b2c51dbc95f5bf0b574ee6c9c99cf6485c79 Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Thu, 28 Mar 2024 21:17:38 -0400 Subject: [PATCH 02/45] add env variable to github action --- .github/workflows/sphinx.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml index 1e63e921..2ac7ccd2 100644 --- a/.github/workflows/sphinx.yml +++ b/.github/workflows/sphinx.yml @@ -1,12 +1,18 @@ name: "Sphinx: Render docs" -on: push +on: + push: + branches: gh-pages + pull_request: + branches: gh-pages jobs: build: runs-on: ubuntu-latest permissions: contents: write + env: + INPUT_DOCS-FOLDER: docs steps: - uses: actions/checkout@v4 - name: Build HTML From 42c61f71692afe85d5233e5a16ab681437f9969d Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Thu, 28 Mar 2024 21:21:58 -0400 Subject: [PATCH 03/45] pin dependecies for building docs --- docs/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 100ece63..3eacdc73 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,3 +1,3 @@ -Sphinx -sphinx_rtd_theme -myst-parser +myst-parser==2.0.0 +Sphinx==7.2.6 +sphinx-rtd-theme==2.0.0 \ No newline at end of file From 3bdf1a629d37cbd4171b4c1fc7c833694f49ccae Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Thu, 28 Mar 2024 22:51:35 -0400 Subject: [PATCH 04/45] adjust sphinx-version in container for sphinx-action --- .github/workflows/sphinx.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml index 2ac7ccd2..51c3ca67 100644 --- a/.github/workflows/sphinx.yml +++ b/.github/workflows/sphinx.yml @@ -16,7 +16,9 @@ jobs: steps: - uses: actions/checkout@v4 - name: Build HTML - uses: ammaraskar/sphinx-action@master + uses: civilx64/sphinx-action@master + with: + docs-folder: docs/ - name: Upload artifacts uses: actions/upload-artifact@v4 with: From 2129782762ba5f1ea8290483b63c3eff8e35f11b Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:03:56 -0400 Subject: [PATCH 05/45] fix path for sphinx output --- .github/workflows/sphinx.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml index 51c3ca67..e12d4654 100644 --- a/.github/workflows/sphinx.yml +++ b/.github/workflows/sphinx.yml @@ -23,10 +23,10 @@ jobs: uses: actions/upload-artifact@v4 with: name: html-docs - path: docs/build/html/ + path: docs/_build/html - name: Deploy uses: peaceiris/actions-gh-pages@v3 if: github.ref == 'refs/heads/main' with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: docs/build/html \ No newline at end of file + publish_dir: docs/_build/html \ No newline at end of file From 835f9a233ee53f2b531107b86e2285f8345aca4d Mon Sep 17 00:00:00 2001 From: Scott Lecher Date: Thu, 28 Mar 2024 23:29:56 -0400 Subject: [PATCH 06/45] Update sphinx.yml --- .github/workflows/sphinx.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml index e12d4654..4f1e78e8 100644 --- a/.github/workflows/sphinx.yml +++ b/.github/workflows/sphinx.yml @@ -22,11 +22,11 @@ jobs: - name: Upload artifacts uses: actions/upload-artifact@v4 with: - name: html-docs + name: github-pages path: docs/_build/html - name: Deploy - uses: peaceiris/actions-gh-pages@v3 + uses: actions-gh-pages@v3 if: github.ref == 'refs/heads/main' with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: docs/_build/html \ No newline at end of file + publish_dir: docs/_build/html From a23f52c0ac9aab69be1dec027de12cddde083250 Mon Sep 17 00:00:00 2001 From: Scott Lecher Date: Thu, 28 Mar 2024 23:36:07 -0400 Subject: [PATCH 07/45] Update sphinx.yml --- .github/workflows/sphinx.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml index 4f1e78e8..50dfd9db 100644 --- a/.github/workflows/sphinx.yml +++ b/.github/workflows/sphinx.yml @@ -22,7 +22,7 @@ jobs: - name: Upload artifacts uses: actions/upload-artifact@v4 with: - name: github-pages + name: html-docs path: docs/_build/html - name: Deploy uses: actions-gh-pages@v3 From 3a14c4ca9763b7553444bf1e372572067fe1b8b3 Mon Sep 17 00:00:00 2001 From: Scott Lecher Date: Thu, 28 Mar 2024 23:40:40 -0400 Subject: [PATCH 08/45] Update sphinx.yml --- .github/workflows/sphinx.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml index 50dfd9db..c8f1a2c2 100644 --- a/.github/workflows/sphinx.yml +++ b/.github/workflows/sphinx.yml @@ -25,8 +25,12 @@ jobs: name: html-docs path: docs/_build/html - name: Deploy - uses: actions-gh-pages@v3 + uses: actions/deploy-pages@v4 if: github.ref == 'refs/heads/main' with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: docs/_build/html + timeout: 600000 + error_count: 10 + reporting_interval: 5000 + artifact_name: html-docs + preview: false From b19fc86a60e409e2f724962cdbbd232a6050fcd5 Mon Sep 17 00:00:00 2001 From: Scott Lecher Date: Thu, 28 Mar 2024 23:42:57 -0400 Subject: [PATCH 09/45] Update sphinx.yml --- .github/workflows/sphinx.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml index c8f1a2c2..bc71c413 100644 --- a/.github/workflows/sphinx.yml +++ b/.github/workflows/sphinx.yml @@ -22,7 +22,7 @@ jobs: - name: Upload artifacts uses: actions/upload-artifact@v4 with: - name: html-docs + name: github-pages path: docs/_build/html - name: Deploy uses: actions/deploy-pages@v4 @@ -32,5 +32,5 @@ jobs: timeout: 600000 error_count: 10 reporting_interval: 5000 - artifact_name: html-docs + artifact_name: github-pages preview: false From f7b56d0cb0070823553a26e65b095256df8572d6 Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:47:54 -0400 Subject: [PATCH 10/45] add deployment for static pages --- .github/workflows/static.yml | 43 ++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 .github/workflows/static.yml diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml new file mode 100644 index 00000000..f1f10577 --- /dev/null +++ b/.github/workflows/static.yml @@ -0,0 +1,43 @@ +# Simple workflow for deploying static content to GitHub Pages +name: Deploy static content to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["release"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Single deploy job since we're just deploying + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Pages + uses: actions/configure-pages@v4 + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + # Upload html docs + path: './docs/_build/html' + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 From 6690020646d58cba6f81ea62f87e609c9976810e Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:53:14 -0400 Subject: [PATCH 11/45] edit static.yml --- .github/workflows/static.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index f1f10577..1ac29310 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -2,9 +2,11 @@ name: Deploy static content to Pages on: - # Runs on pushes targeting the default branch + # Runs on pushes targeting the docs branch push: - branches: ["release"] + branches: ["gh-pages"] + pull_request: + branches: ["gh-pages"] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: From 99bd97c20dd74f4444201de1363150464976becd Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:59:25 -0400 Subject: [PATCH 12/45] add static pages deployment to sphinx build --- .github/workflows/sphinx.yml | 30 ++++++++++++++++-------- .github/workflows/static.yml | 45 ------------------------------------ 2 files changed, 20 insertions(+), 55 deletions(-) delete mode 100644 .github/workflows/static.yml diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml index bc71c413..5f1dfdd9 100644 --- a/.github/workflows/sphinx.yml +++ b/.github/workflows/sphinx.yml @@ -24,13 +24,23 @@ jobs: with: name: github-pages path: docs/_build/html - - name: Deploy - uses: actions/deploy-pages@v4 - if: github.ref == 'refs/heads/main' - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - timeout: 600000 - error_count: 10 - reporting_interval: 5000 - artifact_name: github-pages - preview: false + + # Single deploy job since we're just deploying + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Pages + uses: actions/configure-pages@v4 + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + # Upload html docs + path: './docs/_build/html' + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml deleted file mode 100644 index 1ac29310..00000000 --- a/.github/workflows/static.yml +++ /dev/null @@ -1,45 +0,0 @@ -# Simple workflow for deploying static content to GitHub Pages -name: Deploy static content to Pages - -on: - # Runs on pushes targeting the docs branch - push: - branches: ["gh-pages"] - pull_request: - branches: ["gh-pages"] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. -# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. -concurrency: - group: "pages" - cancel-in-progress: false - -jobs: - # Single deploy job since we're just deploying - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup Pages - uses: actions/configure-pages@v4 - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - # Upload html docs - path: './docs/_build/html' - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 From b840e347dcbf32966a64327e938235023da333c3 Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Fri, 29 Mar 2024 00:09:06 -0400 Subject: [PATCH 13/45] combine deployment with build --- .github/workflows/sphinx.yml | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml index 5f1dfdd9..1b76f277 100644 --- a/.github/workflows/sphinx.yml +++ b/.github/workflows/sphinx.yml @@ -7,7 +7,7 @@ on: branches: gh-pages jobs: - build: + build_and_deploy: runs-on: ubuntu-latest permissions: contents: write @@ -24,23 +24,13 @@ jobs: with: name: github-pages path: docs/_build/html - - # Single deploy job since we're just deploying - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup Pages - uses: actions/configure-pages@v4 - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - # Upload html docs - path: './docs/_build/html' - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 \ No newline at end of file + - name: Setup Pages + uses: actions/configure-pages@v4 + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + # Upload html docs + path: './docs/_build/html' + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 \ No newline at end of file From ad03e0953353c2991897c12ee21f0e6dfc2ccf13 Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Fri, 29 Mar 2024 00:12:14 -0400 Subject: [PATCH 14/45] avoid duplicate artifacts --- .github/workflows/sphinx.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml index 1b76f277..b623324b 100644 --- a/.github/workflows/sphinx.yml +++ b/.github/workflows/sphinx.yml @@ -19,11 +19,6 @@ jobs: uses: civilx64/sphinx-action@master with: docs-folder: docs/ - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: github-pages - path: docs/_build/html - name: Setup Pages uses: actions/configure-pages@v4 - name: Upload artifact From 998c929b9bc49da33ab2e69620f7642b6986e917 Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Fri, 29 Mar 2024 00:17:43 -0400 Subject: [PATCH 15/45] add permission token --- .github/workflows/sphinx.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml index b623324b..5cb074ef 100644 --- a/.github/workflows/sphinx.yml +++ b/.github/workflows/sphinx.yml @@ -1,4 +1,4 @@ -name: "Sphinx: Render docs" +name: "Build docs with Sphinx and deploy to Github Pages" on: push: @@ -11,6 +11,7 @@ jobs: runs-on: ubuntu-latest permissions: contents: write + id-token: write env: INPUT_DOCS-FOLDER: docs steps: From ce6270e6ace9b014b6cf2bdad65adc3046200c26 Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Fri, 29 Mar 2024 00:19:34 -0400 Subject: [PATCH 16/45] add permission token --- .github/workflows/sphinx.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml index 5cb074ef..eef3791b 100644 --- a/.github/workflows/sphinx.yml +++ b/.github/workflows/sphinx.yml @@ -12,6 +12,7 @@ jobs: permissions: contents: write id-token: write + pages: write env: INPUT_DOCS-FOLDER: docs steps: From 477d385e2b49e206dbed7101cdc05676a64f3c7e Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Fri, 29 Mar 2024 00:32:48 -0400 Subject: [PATCH 17/45] separate actions for build only vs build+deploy --- .../{sphinx.yml => build-and-deploy-docs.yml} | 2 -- .github/workflows/build-docs.yml | 28 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) rename .github/workflows/{sphinx.yml => build-and-deploy-docs.yml} (94%) create mode 100644 .github/workflows/build-docs.yml diff --git a/.github/workflows/sphinx.yml b/.github/workflows/build-and-deploy-docs.yml similarity index 94% rename from .github/workflows/sphinx.yml rename to .github/workflows/build-and-deploy-docs.yml index eef3791b..4033b446 100644 --- a/.github/workflows/sphinx.yml +++ b/.github/workflows/build-and-deploy-docs.yml @@ -3,8 +3,6 @@ name: "Build docs with Sphinx and deploy to Github Pages" on: push: branches: gh-pages - pull_request: - branches: gh-pages jobs: build_and_deploy: diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml new file mode 100644 index 00000000..32b3deba --- /dev/null +++ b/.github/workflows/build-docs.yml @@ -0,0 +1,28 @@ +name: "Build docs with Sphinx" + +on: + pull_request: + branches: gh-pages + +jobs: + build_and_deploy: + runs-on: ubuntu-latest + permissions: + contents: write + id-token: write + pages: write + env: + INPUT_DOCS-FOLDER: docs + steps: + - uses: actions/checkout@v4 + - name: Build HTML + uses: civilx64/sphinx-action@master + with: + docs-folder: docs/ + - name: Setup Pages + uses: actions/configure-pages@v4 + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + # Upload html docs + path: './docs/_build/html' \ No newline at end of file From b7c643e7dbb00edfc390d2cc439e4e12b470a1a3 Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Fri, 29 Mar 2024 00:55:37 -0400 Subject: [PATCH 18/45] minor docs cleanup --- docs/dev/validate_readme.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/docs/dev/validate_readme.md b/docs/dev/validate_readme.md index 578b778b..4865e4c4 100644 --- a/docs/dev/validate_readme.md +++ b/docs/dev/validate_readme.md @@ -7,33 +7,32 @@ The application consists of three main submodules, each hosted in separate GitHu Documentation of the separate functionalities can be found within each submodule. d -1. **File Parser**: A module within IfcOpenShell, dedicated to parsing files. https://github.com/IfcOpenShell/step-file-parser -2. **Gherkin Rules**: Contains the rules for validation. It can be run independently by cloning the repository and executing: -https://github.com/buildingSMART/ifc-gherkin-rules +1. **File Parser**: A [module within IfcOpenShell](https://github.com/IfcOpenShell/step-file-parser), dedicated to parsing files. +2. **Gherkin Rules**: Contains the rules for validation. It can be run independently by cloning the [repository](https://github.com/buildingSMART/ifc-gherkin-rules) and executing: - ``` + ```shell pytest -sv ``` Debugging individual rules is supported with commands like: - `````` + ``````shell python test/test_main.py alb001 # For a single rule python test/test_main.py alb001 alb002 # For multiple rules python test/test_main.py path_to_separate_file.py # For a separate file `````` -3. **Shared DataModel**: This module includes Django data models shared between the main repository and the Gherkin repository, serving as a submodule for both. -https://github.com/buildingSMART/ifc-validation-data-model +3. **Shared DataModel**: This [module](https://github.com/buildingSMART/ifc-validation-data-model) includes Django data models shared between the main repository and the Gherkin repository, +serving as a submodule for both. ## Running Validation Checks The application supports multiple validation checks on one or multiple IFC files that can be run separately: -- BSDD-Check - Syntax Check - Schema Check -- Gherkin-Rules Check +- Normative Rules (gherkin) Check +- bSDD Check # How to start? From 6b87c140291aff88766138f5316813697a408bd2 Mon Sep 17 00:00:00 2001 From: Scott Lecher Date: Fri, 29 Mar 2024 01:04:54 -0400 Subject: [PATCH 19/45] initialise github pages for documentation (#38) Initialise documentation with Github Pages and Sphinx --- .github/workflows/build-and-deploy-docs.yml | 31 ++ .github/workflows/build-docs.yml | 28 ++ docs/.gitignore | 1 + docs/Makefile | 20 + docs/_static/favicon.ico | Bin 0 -> 850 bytes docs/_static/user_auth.png | Bin 0 -> 126550 bytes docs/_static/user_include_passed_na_etc.png | Bin 0 -> 3485 bytes docs/_static/user_results_icons.png | Bin 0 -> 12038 bytes docs/conf.py | 31 ++ docs/dev/functional_parts.md | 35 ++ docs/dev/gherkin_deep_dive.md | 9 + docs/dev/ifc_gherkin_rules_readme.md | 61 +++ docs/dev/index.md | 21 + docs/dev/rule_details.md | 489 ++++++++++++++++++++ docs/dev/validate_readme.md | 157 +++++++ docs/index.md | 7 + docs/ref/index.md | 1 + docs/requirements.txt | 3 + docs/user/index.md | 17 + docs/user/using.md | 45 ++ docs/user/validation_overview.md | 54 +++ 21 files changed, 1010 insertions(+) create mode 100644 .github/workflows/build-and-deploy-docs.yml create mode 100644 .github/workflows/build-docs.yml create mode 100644 docs/.gitignore create mode 100644 docs/Makefile create mode 100644 docs/_static/favicon.ico create mode 100644 docs/_static/user_auth.png create mode 100644 docs/_static/user_include_passed_na_etc.png create mode 100644 docs/_static/user_results_icons.png create mode 100644 docs/conf.py create mode 100644 docs/dev/functional_parts.md create mode 100644 docs/dev/gherkin_deep_dive.md create mode 100644 docs/dev/ifc_gherkin_rules_readme.md create mode 100644 docs/dev/index.md create mode 100644 docs/dev/rule_details.md create mode 100644 docs/dev/validate_readme.md create mode 100644 docs/index.md create mode 100644 docs/ref/index.md create mode 100644 docs/requirements.txt create mode 100644 docs/user/index.md create mode 100644 docs/user/using.md create mode 100644 docs/user/validation_overview.md diff --git a/.github/workflows/build-and-deploy-docs.yml b/.github/workflows/build-and-deploy-docs.yml new file mode 100644 index 00000000..4033b446 --- /dev/null +++ b/.github/workflows/build-and-deploy-docs.yml @@ -0,0 +1,31 @@ +name: "Build docs with Sphinx and deploy to Github Pages" + +on: + push: + branches: gh-pages + +jobs: + build_and_deploy: + runs-on: ubuntu-latest + permissions: + contents: write + id-token: write + pages: write + env: + INPUT_DOCS-FOLDER: docs + steps: + - uses: actions/checkout@v4 + - name: Build HTML + uses: civilx64/sphinx-action@master + with: + docs-folder: docs/ + - name: Setup Pages + uses: actions/configure-pages@v4 + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + # Upload html docs + path: './docs/_build/html' + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml new file mode 100644 index 00000000..32b3deba --- /dev/null +++ b/.github/workflows/build-docs.yml @@ -0,0 +1,28 @@ +name: "Build docs with Sphinx" + +on: + pull_request: + branches: gh-pages + +jobs: + build_and_deploy: + runs-on: ubuntu-latest + permissions: + contents: write + id-token: write + pages: write + env: + INPUT_DOCS-FOLDER: docs + steps: + - uses: actions/checkout@v4 + - name: Build HTML + uses: civilx64/sphinx-action@master + with: + docs-folder: docs/ + - name: Setup Pages + uses: actions/configure-pages@v4 + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + # Upload html docs + path: './docs/_build/html' \ No newline at end of file diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 00000000..c6a151b3 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1 @@ +_build/ \ No newline at end of file diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..d4bb2cbb --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..635011ff5cca540196cbabeb603f4ce210c8f9e1 GIT binary patch literal 850 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

MB=0i3j!?LNb=OXOdedrb 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 MVzA;Lo5qR{~)WiQ`o@>`Hp2;O%B>D)Srfn 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 W34y!RtZDy#lniu?wVPlrvHt-iEp=Z2 literal 0 HcmV?d00001 diff --git a/docs/_static/user_results_icons.png b/docs/_static/user_results_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..54f569ae14c21f3a3844b1bf7d653943900f8559 GIT binary patch literal 12038 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 O(v{w-%hkRy5B(pLs%Pu~ literal 0 HcmV?d00001 diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 00000000..2773030e --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,31 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'buildingSMART Validation Service' +copyright = '2024, buildingSMART International' +author = 'buildingSMART International' +release = '0.6' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [ + 'sphinx_rtd_theme', + 'myst_parser', +] + +templates_path = ['_templates'] +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +html_favicon = '_static/favicon.ico' + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'sphinx_rtd_theme' +html_static_path = ['_static'] diff --git a/docs/dev/functional_parts.md b/docs/dev/functional_parts.md new file mode 100644 index 00000000..1345d7b1 --- /dev/null +++ b/docs/dev/functional_parts.md @@ -0,0 +1,35 @@ +# Functional parts + +Functional parts refer to logical grouping of rules that involve similar types of validation. + +These functional part prefixes are used in the naming of the normative rules +and are reported in the results listed by the validation service. + +## Catalog + +| Code | Functional part | Gherkin tag | Notes | +|------|----------------------------------|-------------|--------------------------------------------------| +| ALA | Alignment Agreement | @ALA | | +| ALB | Alignment (business logic) | @ALB | | +| ALG | Alignment (geometry) | @ALG | | +| ALS | Alignment (segments) | @ALS | | +| APA | | @PSE | | +| ASM | Assembling | @ASM | | +| AXG | Axis geometry | @AXG | | +| CLS | Classification reference | @CLS | | +| GEM | Geometric representation | @GEM | Shall be further decomposed | +| GRF | Georeferencing | @GRF | | +| GRP | Grouping | @GRP | | +| IBP | Industry Best Practice | @IBP | Used for @industry-practice tag | +| IFC | IFC | @IFC | Validating correct IFC Schema | +| LIB | Library reference | @LIB | | +| LIP | Linear placement (non-geometric) | @LIP | | +| MAT | Materials | @MAT | | +| MDS | Model setup | @MDS | | +| OJP | Object placement | @OJP | | +| OJT | Object typing | @OJT | | +| PRP | Properties | @PRP | | +| PSE | Property Sets | @PSE | | +| SPS | Spatial structure | @SPS | Need to split SS aggregation and SS containment? | +| STN | Stationing | @STN | | +| SYS | | @SYS | | \ No newline at end of file diff --git a/docs/dev/gherkin_deep_dive.md b/docs/dev/gherkin_deep_dive.md new file mode 100644 index 00000000..1050eab0 --- /dev/null +++ b/docs/dev/gherkin_deep_dive.md @@ -0,0 +1,9 @@ +# A deep dive into gherkin rule implementations + +TODO: Ghesselink + +## Decorator + +## Context stacking + +## Validaton Outcomes diff --git a/docs/dev/ifc_gherkin_rules_readme.md b/docs/dev/ifc_gherkin_rules_readme.md new file mode 100644 index 00000000..ed24d942 --- /dev/null +++ b/docs/dev/ifc_gherkin_rules_readme.md @@ -0,0 +1,61 @@ +# IFC Gherkin rules + +## Usage as part of buildingSMART validation service + +This repository is one of three submodules in the overall validation service. See (application_structure) for more information. + +## Making changes + +The rules developed in this repository follow the general ideas of Gherkin and its python implementation behave. + +This means there are human readable definitions of rules and Python implementations. + +A third component of this repository are minimal sample files with expected outcomes, which means that extensions and modifications can be suggested with confidence of not breaking existing functionality. + +## Command line usage + +Informal propositions and implementer agreements written in Gherkin for automatic validation of IFC building models using steps implemented in IfcOpenShell. + +```shell +$ python -m ifc-gherkin-rules ifc-gherkin-rules\test\files\gem001\fail-gem001-cube-advanced-brep.ifc +Feature: Shell geometry propositions/IfcClosedShell.v1 + URL: /blob/8dbd61e/features/geometry.shells.feature + + Step: Every oriented edge shall be referenced exactly 1 times by the loops of the face + + * #29=IfcClosedShell((#104,#115,#131,#147,#163,#179)) + On instance #29=IfcClosedShell((#104,...,#179)) the edge (-0.183012701892219, + 0.683012701892219, 1.0) -> (-0.683012701892219, -0.183012701892219, 1.0) was + referenced 2 times + + * #29=IfcClosedShell((#104,#115,#131,#147,#163,#179)) + On instance #29=IfcClosedShell((#104,...,#179)) the edge (-0.5, -0.5, 0.0) -> + (-0.5, 0.5, 0.0) was referenced 2 times + + * #29=IfcClosedShell((#104,#115,#131,#147,#163,#179)) + On instance #29=IfcClosedShell((#104,...,#179)) the edge (-0.5, 0.5, 0.0) -> + (0.5, 0.5, 0.0) was referenced 2 times + + * #29=IfcClosedShell((#104,#115,#131,#147,#163,#179)) + On instance #29=IfcClosedShell((#104,...,#179)) the edge (-0.683012701892219, + -0.183012701892219, 1.0) -> (0.183012701892219, -0.683012701892219, 1.0) was + referenced 2 times + + * #29=IfcClosedShell((#104,#115,#131,#147,#163,#179)) + On instance #29=IfcClosedShell((#104,...,#179)) the edge (0.183012701892219, + -0.683012701892219, 1.0) -> (0.683012701892219, 0.183012701892219, 1.0) was + referenced 2 times + + * #29=IfcClosedShell((#104,#115,#131,#147,#163,#179)) + On instance #29=IfcClosedShell((#104,...,#179)) the edge (0.5, -0.5, 0.0) -> + (-0.5, -0.5, 0.0) was referenced 2 times + + * #29=IfcClosedShell((#104,#115,#131,#147,#163,#179)) + On instance #29=IfcClosedShell((#104,...,#179)) the edge (0.5, 0.5, 0.0) -> + (0.5, -0.5, 0.0) was referenced 2 times + + * #29=IfcClosedShell((#104,#115,#131,#147,#163,#179)) + On instance #29=IfcClosedShell((#104,...,#179)) the edge (0.683012701892219, + 0.183012701892219, 1.0) -> (-0.183012701892219, 0.683012701892219, 1.0) was + referenced 2 times +``` diff --git a/docs/dev/index.md b/docs/dev/index.md new file mode 100644 index 00000000..3e3e42b5 --- /dev/null +++ b/docs/dev/index.md @@ -0,0 +1,21 @@ +# Developer Guide + +```{include} validate_readme.md +:heading-offset: 1 +``` + +```{include} ifc_gherkin_rules_readme.md +:heading-offset: 1 +``` + +```{include} rule_details.md +:heading-offset: 1 +``` + +```{include} functional_parts.md +:heading-offset: 1 +``` + +```{include} gherkin_deep_dive.md +:heading-offset: 1 +``` diff --git a/docs/dev/rule_details.md b/docs/dev/rule_details.md new file mode 100644 index 00000000..552c71f1 --- /dev/null +++ b/docs/dev/rule_details.md @@ -0,0 +1,489 @@ +# Detailed Information for Normative Rules + +Follow these steps to add a new rule to the Validation Service + +| n. | Step | Responsible | +|----|------------------------------------------------------------------------------------------|-----------------------------| +| 1 | Create a new branch in the bSI ifc-gherkin-rules repository | bSI Validation Service team | +| 2 | In this branch, start developing the rule needed **following instructions below** | rule developer | +| 3 | Create a pull request to further test the rule(s) behavior using the sandbox environment | rule developer | +| 4 | Assign a reviewer to the pull request when you think the rule is ready to be merged | rule developer | +| 5 | Review the pull request | bSI Validation Service team | +| 6 | (optional) Fix the rule according to feedback from reviewer | rule developer | +| 7 | Approve and merge the pull request | bSI Validation Service team | + +## 1. Branch creation + +In the buildingSMART [GitHub repository containing all rules](https://github.com/buildingSMART/ifc-gherkin-rules), create the branch that will be used to develop the new rule. + +- Name the branch with the name of the new rule. Example: `GEM900` for a new rule in the geometry functional part +- Add 1 rule per branch, to facilitate review (1 rule = 1 `.feature` file) + +## 2. Rule development + +A rule is considered complete when it has: + +- a Gherkin [**feature file**](21-write-feature-files-gherkin-rules-for-ifc) +- corresponding python implementation (aka, [**python steps**](22-write-python-steps)) +- a set of [**unit test files**](23-write-unit-test-files) + +Below are instructions for all these 3 components. + +(21-write-feature-files-gherkin-rules-for-ifc)= +### 2.1) Write feature files (gherkin rules) for IFC + +A feature file is a file, written using Gherkin syntax, describing the rule behavior. +In the branch just created, add a Gherkin feature file following these instructions. + +**File format**: `.feature` + +**Location**: https://github.com/buildingSMART/ifc-gherkin-rules/tree/main/features + +#### Naming convention for feature files + +- The file name is rule code_rule title +- The rule code is made of 3 digits capital letters (taken from the list of [Functional parts](./functional_parts.md)) + 3 digits number +- The rule code, and rule title, must be unique +- The rule title shall have no space and shall use `-` as separator + +

wrong + +``` +SPS001 - Basic-spatial-structure-for-buildings.feature +SPS001_Basic spatial structure for buildings.feature +SPS001 - Basic spatial structure for buildings.feature +``` +
+
right + +``` +SPS001_Basic-spatial-structure-for-buildings.feature +``` +
+ +#### Mandatory content + +`.feature` files: +- must include one and only one of these tags to classify the validation category: + - `@critical` + - `@implementer-agreement` + - `@informal-proposition` + - `@industry-practice` (warning; not a pass / fail) +- must include a 3-character alpha tag to the functional part. See [Functional parts](./functional_parts.md) +- must include a single tag indicating the version of the feature file as a 1-based integer + - Example: `@version1` for initial version of a feature file + - Example: `@version3` for the third version of a feature file + - Minor changes such as fixing typos or re-wording the description do not increment the version + - Any change to a **"Given"** or **"Then"** statement, or to a step implementation, requires the version number to be incremented by 1. +- must include one or more tags indicating the [error code](error-codes) to be raised + - If all scenarios raise the same error, then this tag should be placed immediately above the **"Feature:"** line + +
example + + ``` + @implementer-agreement + @GRF + @version1 + @E00050 + Feature: GRF001 - Identical.... + ``` + +
+ + - If some scenarios raise different error codes, then this tag should be placed immediately above each **"Scenario" + ** line + +
example + + ``` + @implementer-agreement + @ALS + @version1 + Feature: ALS005 - Alignment shape representation + + Background: ... + + @E00020 + Scenario: Agreement on ... representation - Value + + @E00010 + Scenario: Agreement on ... representation - Type + ``` + +
+ +- must include exactly 1 Feature +- the naming convention for the Feature is the following: rule code - rule title (the same used for the file name). For the rule title blank spaces must be used instead of `-` + +
wrong + +``` +Feature: ALB001_Alignment Layout + +Given ... +Then ... +``` +``` +@ALB +Feature: ALB001_Alignment-Layout + +Given ... +Then ... +``` +``` +@ALB +Feature: ALB001 - Alignment-Layout + +Given ... +Then ... +``` + +
+
right + +``` +@ALB +Feature: ALB001 - Alignment Layout + +Given ... +Then ... +``` +
+ + - must include **a description of the rule** that start with "The rule verifies that..." + +
example + +``` +@implementer-agreement +@ALB +Feature: ALB003 - Allowed entities nested in Alignment +The rule verifies that an Alignment has a nesting relationship with its components (i.e., Horizontal, Vertical, Cant layouts) or with Referents (e.g., mileage markers). And not with any other entity. + + Scenario: Agreement on nested elements of IfcAlignment + Given ... + Then ... +``` +
+ +#### Mandatory Given(s) +If the rule in the feature file applies only to specific IFC version(s) and/or View Definition(s), then the feature file (or each of its Scenarios, if it has more than one) must start with Given steps specifying the applicability of the following steps + +
examples + +``` +Given A model with Schema "IFC2X3" +Given A file with Model View Definition "CoordinationView" +``` +``` +Given A model with Schema "IFC2X3" or "IFC4" +Given A file with Model View Definition "CoordinationView" or "ReferenceView" +``` +
+ +#### Optional content +`.feature` files: +- can include 1 or more Scenarios +- Scenario titles have no constraints +- can include the `@disabled` tag to temporarily remove them from processing + +#### No spaces between steps + +
wrong + +``` +Given A model with Schema "IFC4.3" + +Then Each IfcAlignmentHorizontal must be nested only by 1 IfcAlignment +Then Each IfcAlignmentVertical must be nested only by 1 IfcAlignment +Then Each IfcAlignmentCant must be nested only by 1 IfcAlignment +``` +
+
right + +``` +Given A model with Schema "IFC4.3" +Then Each IfcAlignmentHorizontal must be nested only by 1 IfcAlignment +Then Each IfcAlignmentVertical must be nested only by 1 IfcAlignment +Then Each IfcAlignmentCant must be nested only by 1 IfcAlignment +``` +
+ +#### Watch out for extra blank spaces + +
wrong + +``` +Given A model with Schema "IFC4.3" +Then Each IfcAlignmentHorizontal must be nested only by 1 IfcAlignment +Then Each IfcAlignmentVertical must be nested only by 1 IfcAlignment +Then Each IfcAlignmentCant must be nested only by 1 IfcAlignment +``` +
+
right + +``` +Given A model with Schema "IFC4.3" +Then Each IfcAlignmentHorizontal must be nested only by 1 IfcAlignment +Then Each IfcAlignmentVertical must be nested only by 1 IfcAlignment +Then Each IfcAlignmentCant must be nested only by 1 IfcAlignment +``` +
+ +#### Do not use punctuation at the end of the steps + +
wrong + +``` +Given A model with Schema "IFC4.3", +Then Each IfcAlignmentHorizontal must be nested only by 1 IfcAlignment; +Then Each IfcAlignmentVertical must be nested only by 1 IfcAlignment; +Then Each IfcAlignmentCant must be nested only by 1 IfcAlignment. +``` +
+
right + +``` +Given A model with Schema "IFC4.3" +Then Each IfcAlignmentHorizontal must be nested only by 1 IfcAlignment +Then Each IfcAlignmentVertical must be nested only by 1 IfcAlignment +Then Each IfcAlignmentCant must be nested only by 1 IfcAlignment +``` +
+ +#### Be careful when typing parameters. They are case-sensitive! + +
wrong + +``` +Given A model with schema "IFC4.3", +``` +
+
right + +``` +Given A model with Schema "IFC4.3" +``` +
+ +#### Must vs Shall +Use **must**, not **shall** to impose requirements.[ALB001_Alignment-in-spatial-structure.feature](ALB001_Alignment-in-spatial-structure.feature) +"Shall" is ambiguous, also in the legal field the community is moving to a strong preference for “must” as the clearest way to express a requirement or obligation. + +
wrong + +``` +Given A model with Schema "IFC2X3" +Given A file with Model View Definition "CoordinationView" +Then There shall be exactly 1 IfcSite element(s) +``` +
+
right + +``` +Given A model with Schema "IFC2X3" +Given A file with Model View Definition "CoordinationView" +Then There must be exactly 1 IfcSite element(s) +``` +
+ +#### Verbs for IFC relationships +When a rule requires a specific IFC relationship to exist, refer to the table below for the right verb to be used. + +| IFC relationship | Verb for rules | Examples | +|------------------------|-----------------------|--------------------------------------------------------------------| +| IfcRelAggregates | aggregate, aggregates | Then IfcSite must aggregate IfcBuilding | +| IfcRelNests | nest, nests | Then Each IfcAlignmentVertical nests a list of IfcAlignmentSegment | +| ... | | + + +#### Reference for schema versioning +Rules that are applicable only to specific schema versions must specify +the schema version with the initial `Given` statement. + +For example, alignment entities were introduced in IFC4.3 and are not valid +in earlier schema versions. + +``` +Given A model with Schema "IFC4.3" +Given An IfcAlignment +Then ... +``` + +Multiple schema versions may be specified if applicable. + +``` +Given A model with Schema "IFC2X3" or "IFC4" +Given An IfcElement +Then ... +``` + +##### Valid (active, not withdrawn or retired) Schema Versions + +| Version | Formal Name | Schema id | Common Name | +|---------|---------------|-------------|-------------| +| 4.3.2.0 | IFC4.3 ADD2 | IFC4X3_ADD2 | IFC4.3 | +| 4.0.2.1 | IFC4 ADD2 TC1 | IFC4 | IFC4 | +| 2.3.0.1 | IFC2x3 TC1 | IFC2X3 | IFC2x3 | + +(22-write-python-steps)= +### 2.2) Write python steps + +The python steps are the implementation (using python language) of the Gherkin grammar used in the feature files. +In the same branch used for the Gherkin rules, change or add python steps following these instructions. + +**File format**: `.py` + +**Location**: https://github.com/buildingSMART/ifc-gherkin-rules/tree/main/features/steps + +#### Naming convention for python files + +For the moment, all python steps are contained in [steps.py](https://github.com/buildingSMART/ifc-gherkin-rules/blob/main/features/steps/steps.py). Therefore, **you should not create a new python file, just expand the existing one.** + +:construction: :construction: :construction: +*In the future, when this file grows, python steps may be splitted in more files - using a certain criteria (e.g., functional parts). When this will be the case, the instruction will be: locate the best .py file to host your steps and start adding your steps* + +#### Steps parametrisation + +When creating a new step, think about parametrisation and optimisation of the step for future uses. + +#### Step re-use + +Before creating a new step, check if something similar already exist. +Try to reuse existing steps. + +#### Do not use "when" or "And" keywords + +The "when" keyword must not be used. +The "And" keyword must not be used. +Instead, repeat the "Given" or "Then" as appropriate. + +Allowed keywords are: `Given`, and `Then`. + +#### Use of existing IfcOpenShell APIs + +Try not to use existing functionality included in the `ifcopenshell.api` namespace. + + + + + + + + +(23-write-unit-test-files)= +### 2.3) Write unit test files + +Unit test files are atomic IFC files, created to develop a rule and test its behavior. +In the same branch used for the Gherkin rules, and python steps, create unit test files following these instructions. **IMPORTANT**: every rule developed must have a set of unit test files. + +**File format**: `.ifc` + +**Location**:[ifc-gherkin-rules/tree/main/test/files](https://github.com/buildingSMART/ifc-gherkin-rules/tree/main/test/files) + +- in the test/files folder, create a subfolder using the rule code (E.g., ALB001) +- add the set of unit test files for that rule in this subfolder + +#### Naming convention for unit test files + +Unit test files must follow this naming convention: + +`Expected result`-`rule code`-`rule scenario`-`short_informative_description`.ifc + +Or in case where a rule has no scenarios: +`Expected result`-`rule code`-`short_informative_description`.ifc + +
Examples + +```shell +pass-alb001-short_informative_description.ifc +fail-alb001-scenario01-short_informative_description.ifc +fail-alb001-short_informative_description.ifc +``` + +
+ + +#### Content of the unit tests subfolder + +The unit test subfolder must contain: + +- all unit test files (.ifc) +- a README file (.md), listing the files and their expected behavior. Using the [template table](#table-template-for-unit-test-files) below +- where used, the script (.py) created to generate the unit test files + +#### Number of unit tests required + +- Each rule developed must have a set of unit test files +- There must be at least 1 fully compliant unit test file +- Fail files must cover all scenarios of the rule + +(table-template-for-unit-test-files)= +#### Table template for unit test files + +Example table describing unit test expected results + +| File name | Expected result | Error log | Description | +|-------------------------------------------------------|-----------------|----------------------------------------------------------------------------------|----------------------------------------------------------------------------------| +| pass-alb002-alignment-layout | success | n.a. | | +| fail-alb002-scenario01-nested_attributes_IfcAlignment | fail | The instance IfcAlignment is nesting two instances of IfcAlignmentHorizontal ... | Error is descriptive or exactly the error in pytest? If exactly, multiple row... | +| fail-alb002-scenario02-two_alignments | fail | The following 2 instances were encountered: IfcAlignment #23, IfcAlignment #906 | For IfcAlignmentHorizontal, IfcAlignmentVertical and IfcAlignmentCant | +| fail-alb002-scenario03-layout | fail | The instance #906=IfcAlignment is nesting #907=IfcWall | Includes errors for scenario 2 | +| fail-alb002-scenario04-alignment_segments | fail | The instance (s) #28=IfcAlignmentHorizontal is assigned to #906=IfcWall | @todo IfcAlignmentVertical, IfcAlignmentCant. As well as empty list/typo's? | + + + +## 4. Assign a reviewer to the pull request +... +## 5. Review the pull request +... +## 6. (optional) Fix the rule according to feedback from reviewer +... +## 7. Approve and merge the pull request +... + +## Appendix + +(error-codes)= +### Error Codes + +Error codes are used to classify and categorize outcomes from the validation service and are +implemented in [ifc-validation-data-model/main/models.py#L937](https://github.com/buildingSMART/ifc-validation-data-model/blob/main/models.py#L937). + +| Error Code | Description | +|------------|----------------------------------------| +| P00010 | Passed | +| N00010 | Not Applicable | +| | | +| E00001 | Syntax Error | +| E00002 | Schema Error | +| E00010 | Type Error | +| E00020 | Value Error | +| E00030 | Geometry Error | +| E00040 | Cardinality Error | +| E00050 | Duplicate Error | +| E00060 | Placement Error | +| E00070 | Units Error | +| E00080 | Quantity Error | +| E00090 | Enumerated Value Error | +| E00100 | Relationship Error | +| E00110 | Naming Error | +| E00120 | Reference Error | +| E00130 | Resource Error | +| E00140 | Deprecation Error | +| E00150 | Shape Representation Error | +| E00160 | Instance Structure Error | +| | | +| W00010 | Alignment Contains Business Logic Only | +| W00020 | Alignment Contains Geometry Only | +| W00030 | Warning | +| | | +| X00040 | Executed | + +#### Notes + +`Not Applicable` refers to a rule that does not apply because of the schema version. +`Executed` refers to a rule that does apply because of schema version, +but the model does not contain any entities validated as part of a particular rule. + +Both outcomes are reported as "N/A" in the validation service user interface. \ No newline at end of file diff --git a/docs/dev/validate_readme.md b/docs/dev/validate_readme.md new file mode 100644 index 00000000..4865e4c4 --- /dev/null +++ b/docs/dev/validate_readme.md @@ -0,0 +1,157 @@ + +# Application Structure + +The application consists of three main submodules, each hosted in separate GitHub repositories. Docker Compose is configured to automatically bind the correct submodule versions for local deployment. + +## Submodules + +Documentation of the separate functionalities can be found within each submodule. d + +1. **File Parser**: A [module within IfcOpenShell](https://github.com/IfcOpenShell/step-file-parser), dedicated to parsing files. +2. **Gherkin Rules**: Contains the rules for validation. It can be run independently by cloning the [repository](https://github.com/buildingSMART/ifc-gherkin-rules) and executing: + + ```shell + pytest -sv + ``` + + Debugging individual rules is supported with commands like: + + ``````shell + python test/test_main.py alb001 # For a single rule + python test/test_main.py alb001 alb002 # For multiple rules + python test/test_main.py path_to_separate_file.py # For a separate file + `````` + +3. **Shared DataModel**: This [module](https://github.com/buildingSMART/ifc-validation-data-model) includes Django data models shared between the main repository and the Gherkin repository, +serving as a submodule for both. + +## Running Validation Checks + +The application supports multiple validation checks on one or multiple IFC files that can be run separately: + +- Syntax Check +- Schema Check +- Normative Rules (gherkin) Check +- bSDD Check + +# How to start? + +Depending on your workflow, you can run all or some services via Docker Compose. + +Below are a few common options to run and debug these services locally. +More scenario's exist - have a look at the various *make* files. + +## Option 1 - Run minimal set of services via Docker Compose (easiest to run) + +1. Make sure Docker is running. + +2. Start all services. + +```shell +make start + +or + +docker compose up +``` + +3. This pulls Docker-hub images, builds and spins up **six** different services: + +``` +db - PostgreSQL database +redis - Redis instance +backend - Django Admin + API's +worker - Celery worker +flower - Celery flower dashboard +frontend - React UI +``` + +4. One-time only: create Django superuser accounts for Django Admin and Celery background worker(s), for example: + +```shell +docker exec -it backend sh + +cd backend + +DJANGO_SUPERUSER_USERNAME=root DJANGO_SUPERUSER_PASSWORD=root DJANGO_SUPERUSER_EMAIL=root@localhost python3 manage.py createsuperuser --noinput + +DJANGO_SUPERUSER_USERNAME=SYSTEM DJANGO_SUPERUSER_PASSWORD=system DJANGO_SUPERUSER_EMAIL=system@localhost python3 manage.py createsuperuser --noinput + +exit +``` + +5. Navigate to different services: + +- Validation Service - React UI: http://localhost +- Django Admin UI: http://localhost/admin (or http://localhost:8000/admin) - default user/password: root/root +- Django API - Swagger: http://localhost/api/swagger-ui +- Django API - Redoc: http://localhost/api/redoc +- Celery Flower UI: http://localhost:5555 + +6. Optionally, use a tool like curl or Postman to invoke API requests directly + +## Option 2 - Local debugging + infrastructure via Docker Compose (easiest to debug) + +1. Make sure Docker is running. + +2. Start infrastructure services only (Redis, Postgres, Celery Flower) + +```shell +make start-infra + +or + +docker compose -f docker-compose.infra_only.yml up +``` + + +3. This pulls **three** different Docker-hub images and spins up services: + +``` +db - PostgreSQL database +redis - Redis instance +flower - Celery flower dashboard +``` + +4. Start Django backend (Admin + API) + +```shell +cd backend +make install +make start-django +``` + +5. Start Celery worker(s) + +```shell +cd backend +make start-worker +``` + +6. Start Node Development server to serve the React UI + +```shell +cd frontend +npm install +npm run start +``` + +7. One-time only: create Django superuser accounts for Django Admin and Celery background worker(s), for example: + +```shell +cd backend + +DJANGO_SUPERUSER_USERNAME=root DJANGO_SUPERUSER_PASSWORD=root DJANGO_SUPERUSER_EMAIL=root@localhost python3 manage.py createsuperuser --noinput + +DJANGO_SUPERUSER_USERNAME=SYSTEM DJANGO_SUPERUSER_PASSWORD=system DJANGO_SUPERUSER_EMAIL=system@localhost python3 manage.py createsuperuser --noinput +``` + +8. Navigate to different services: + +- Validation Service - React UI: http://localhost:3000 +- Django Admin UI: http://localhost:8000/admin - default user/password: root/root +- Django API - Swagger: http://localhost:8000/api/swagger-ui +- Django API - Redoc: http://localhost:8000/api/redoc +- Celery Flower UI: http://localhost:5555 + +9. Optionally, use a tool like curl or Postman to invoke API requests directly \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..c2ce4924 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,7 @@ +# Welcome to the buildingSMART Validation Service Docs! + +```{toctree} +user/index.md +dev/index.md +ref/index.md +``` diff --git a/docs/ref/index.md b/docs/ref/index.md new file mode 100644 index 00000000..1c99759e --- /dev/null +++ b/docs/ref/index.md @@ -0,0 +1 @@ +# Reference Information \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 00000000..3eacdc73 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,3 @@ +myst-parser==2.0.0 +Sphinx==7.2.6 +sphinx-rtd-theme==2.0.0 \ No newline at end of file diff --git a/docs/user/index.md b/docs/user/index.md new file mode 100644 index 00000000..6f6d65f7 --- /dev/null +++ b/docs/user/index.md @@ -0,0 +1,17 @@ +# User Guide + +## Introduction + +Data validation is a key component of openBIM(r) workflows. +The IFC Validation Services allows users to check the validity of their IFC models +against the IFC standard. + +```{include} using.md +:heading-offset: 1 +:relative-images: +``` + +```{include} validation_overview.md +:heading-offset: 1 +:relative-images: +``` diff --git a/docs/user/using.md b/docs/user/using.md new file mode 100644 index 00000000..c69fcb18 --- /dev/null +++ b/docs/user/using.md @@ -0,0 +1,45 @@ +# Using the Validation Service + +## Logging In + +Upon first visiting the site, you will need to authenticate with your user name and password. + +```{image} ../_static/user_auth.png +:alt: Login screen +:scale: 80 % +:align: center +``` + +You can create a new account if you don't have one already by following +the **Sign up now** link. + +```{note} +Your usage of the Validation Service is subject to the +[Terms of Service](https://www.buildingsmart.org/wp-content/uploads/2021/09/20210923_TermsOfService.pdf). +``` + +## File upload + +```{note} +At this time the service will only accept non-zipped STEP physical files having extension *.ifc* and no greater than 256 MB in size. +``` + +## File processing + +## Results + +### Color codes and icons + +```{image} ../_static/user_results_icons.png +:alt: Color codes and icons displayed by the service +:scale: 80 % +:align: center +``` + +Pass results are hidden by default but can be shown by clicking the checkbox in the upper-right corner: + +```{image} ../_static/user_include_passed_na_etc.png +:alt: Button to hide passing, disabled, or not applicable results +:scale: 110 % +:align: center +``` diff --git a/docs/user/validation_overview.md b/docs/user/validation_overview.md new file mode 100644 index 00000000..6c07df14 --- /dev/null +++ b/docs/user/validation_overview.md @@ -0,0 +1,54 @@ +# Understanding the steps of the validation process + +## Syntax + +The first step in the validation process looks at the uploaded file to confirm that +it is a valid STEP Physical File (SPF) in accordance with [ISO 10303-21](https://www.iso.org/standard/63141.html). + +## Schema + +Schema validation consists of two parts: + +1. Schema Version +2. Schema Compliance + +### Schema Version + +This check confirms that the schema identifier is one of the following: + +- `IFC2X3` +- `IFC4`, +- `IFC4X3_ADD2` + +### Schema Compliance + +The schema compliance checks that all `WHERE` rules in the EXPRESS schema have passed. +This check also flags any entity types that are not included in a given schema version. + +For example: `IfcAlignment` entity is only valid for schema version `4X3_ADD2`, +so it is not valid as part of a file with schema version `IFC2X3`. + +## Normative Checks + +There are two categories of normative checks: + +1. Implementer Agreements +2. Informal Propositions +3. Industry Practices + +### Implementer Agreements + +These are normative checks that have been ratified as official agreements amongst software implementers. + +### Informal Propositions + +These are normative checks that have not been ratified as implementer agreements, +but are still considered mandatory for a file to be considered valid. + +### Industry Practices + +These series of checks are different than the previous two in that they will only raise a warning and not be considered an error. + +## bsDD Checks + +These checks verify that all applicable buildingSMART Data Dictionary (bsDD) requirements are met. From 6a7695cb17662d25dbcab96316830ce6a0d7b7c6 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Mon, 1 Apr 2024 16:04:16 +0200 Subject: [PATCH 20/45] Empty commit From 0de8b27b66677397497d3ef2e3cab092a530c808 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Mon, 1 Apr 2024 16:48:35 +0200 Subject: [PATCH 21/45] Update validation_overview.md --- docs/user/validation_overview.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/user/validation_overview.md b/docs/user/validation_overview.md index 6c07df14..a55ee44a 100644 --- a/docs/user/validation_overview.md +++ b/docs/user/validation_overview.md @@ -17,15 +17,21 @@ Schema validation consists of two parts: This check confirms that the schema identifier is one of the following: - `IFC2X3` -- `IFC4`, +- `IFC4` - `IFC4X3_ADD2` ### Schema Compliance -The schema compliance checks that all `WHERE` rules in the EXPRESS schema have passed. -This check also flags any entity types that are not included in a given schema version. +The schema compliance checks the following aspects that are defined in the EXPRESS schema: -For example: `IfcAlignment` entity is only valid for schema version `4X3_ADD2`, + - Entity attributes are correctly populated, correct number of attributes and correct type and cardinalities in case of aggregates + - Inverse attributes are correctly populated and with the correct cardinalities + - Entity-scoped `WHERE` rules + - Global rules + +This check also flags any entity types that are not included in a given schema version, or the instantiation of abstract entities. + +For example: `IfcAlignment` entity is only valid for schema version `IFC4X3_ADD2`, so it is not valid as part of a file with schema version `IFC2X3`. ## Normative Checks From 5651355e39b791fe2994fc5d4be42ef68c9c01d8 Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Tue, 2 Apr 2024 17:24:27 -0400 Subject: [PATCH 22/45] clarify non-normative checks in documentation --- docs/conf.py | 2 ++ docs/user/validation_overview.md | 21 ++++++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 2773030e..90cc0f7b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,3 +29,5 @@ html_theme = 'sphinx_rtd_theme' html_static_path = ['_static'] + +myst_links_external_new_tab = True diff --git a/docs/user/validation_overview.md b/docs/user/validation_overview.md index a55ee44a..f39c10af 100644 --- a/docs/user/validation_overview.md +++ b/docs/user/validation_overview.md @@ -1,11 +1,14 @@ -# Understanding the steps of the validation process +# Understanding the validation process -## Syntax +Given an IFC file, the Validation Service provides a judgement of conformity +against the IFC standard - including schema and specification + +## STEP Syntax The first step in the validation process looks at the uploaded file to confirm that it is a valid STEP Physical File (SPF) in accordance with [ISO 10303-21](https://www.iso.org/standard/63141.html). -## Schema +## IFC Schema Schema validation consists of two parts: @@ -40,7 +43,6 @@ There are two categories of normative checks: 1. Implementer Agreements 2. Informal Propositions -3. Industry Practices ### Implementer Agreements @@ -51,10 +53,15 @@ These are normative checks that have been ratified as official agreements amongs These are normative checks that have not been ratified as implementer agreements, but are still considered mandatory for a file to be considered valid. +## Additional, Non-normative Checks + ### Industry Practices -These series of checks are different than the previous two in that they will only raise a warning and not be considered an error. +This step involves checking the IFC file against common practices and sensible defaults. +None of these checks render the IFC file invalid. +Therefore, any issues identified result in warnings rather than errors. -## bsDD Checks +### buildingSMART Data Dictionary (bSDD) Compliance -These checks verify that all applicable buildingSMART Data Dictionary (bsDD) requirements are met. +This step includes checking whether references to classifications and properties from bSDD +found in an IFC file comply the source definitions in bSDD. From 60f2c8ca7393928ac18c2a1ea60b538c6003cfd1 Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Mon, 15 Apr 2024 09:14:33 -0400 Subject: [PATCH 23/45] add system architecture sketch to docs --- .../_static/dev_system_architecture_sketch.png | Bin 0 -> 130735 bytes docs/dev/validate_readme.md | 17 +++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 docs/_static/dev_system_architecture_sketch.png diff --git a/docs/_static/dev_system_architecture_sketch.png b/docs/_static/dev_system_architecture_sketch.png new file mode 100644 index 0000000000000000000000000000000000000000..2719d6f4c0384fecfc8014cf5516ffa1f9bc1d82 GIT binary patch literal 130735 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

a8$*PASi?z~nuyhx=)B7-#c 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 literal 0 HcmV?d00001 diff --git a/docs/dev/validate_readme.md b/docs/dev/validate_readme.md index 4865e4c4..c4f2988a 100644 --- a/docs/dev/validate_readme.md +++ b/docs/dev/validate_readme.md @@ -1,11 +1,24 @@ # Application Structure -The application consists of three main submodules, each hosted in separate GitHub repositories. Docker Compose is configured to automatically bind the correct submodule versions for local deployment. +## System Architecture + +```{image} ../_static/dev_system_architecture_sketch.png +:alt: System Architure +:align: center +``` + +The Validation Service is built on [django](https://www.djangoproject.com), +using [Postgres](https://www.postgresql.org) as the database, +[Redis](https://www.redis.io) for task management, +and [Celery](https://docs.celeryq.dev/en/stable/index.html) for distributing the work of running the validation tasks. +The service consists of multiple containers managed with Docker compose. ## Submodules -Documentation of the separate functionalities can be found within each submodule. d +The application consists of three main submodules, each hosted in separate GitHub repositories. Docker Compose is configured to automatically bind the correct submodule versions for local deployment. + +Documentation of the separate functionalities can be found within each submodule. 1. **File Parser**: A [module within IfcOpenShell](https://github.com/IfcOpenShell/step-file-parser), dedicated to parsing files. 2. **Gherkin Rules**: Contains the rules for validation. It can be run independently by cloning the [repository](https://github.com/buildingSMART/ifc-gherkin-rules) and executing: From 2367dad463ec142db0012eda7f18b294d19a765a Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Sat, 21 Sep 2024 14:36:36 -0400 Subject: [PATCH 24/45] IVS-125 initial commit --- docs/_static/user_results_icons_no_bSDD.png | Bin 0 -> 7187 bytes docs/dev/functional_parts.md | 93 ++++++++++++++------ docs/dev/gherkin_deep_dive.md | 33 ++++++- docs/dev/rule_details.md | 5 +- docs/ref/index.md | 9 +- docs/ref/normative-rules/ALA001.md | 39 ++++++++ docs/user/using.md | 2 +- docs/user/validation_overview.md | 6 +- 8 files changed, 153 insertions(+), 34 deletions(-) create mode 100644 docs/_static/user_results_icons_no_bSDD.png create mode 100644 docs/ref/normative-rules/ALA001.md diff --git a/docs/_static/user_results_icons_no_bSDD.png b/docs/_static/user_results_icons_no_bSDD.png new file mode 100644 index 0000000000000000000000000000000000000000..c77b413f8d0eac2e1a8a862901357bbd92bc3975 GIT binary patch literal 7187 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 Zep0)`-~Ont2+y_ws*0KlWv|`^{ud2#@qGXQ literal 0 HcmV?d00001 diff --git a/docs/dev/functional_parts.md b/docs/dev/functional_parts.md index 1345d7b1..9ce3a134 100644 --- a/docs/dev/functional_parts.md +++ b/docs/dev/functional_parts.md @@ -7,29 +7,70 @@ and are reported in the results listed by the validation service. ## Catalog -| Code | Functional part | Gherkin tag | Notes | -|------|----------------------------------|-------------|--------------------------------------------------| -| ALA | Alignment Agreement | @ALA | | -| ALB | Alignment (business logic) | @ALB | | -| ALG | Alignment (geometry) | @ALG | | -| ALS | Alignment (segments) | @ALS | | -| APA | | @PSE | | -| ASM | Assembling | @ASM | | -| AXG | Axis geometry | @AXG | | -| CLS | Classification reference | @CLS | | -| GEM | Geometric representation | @GEM | Shall be further decomposed | -| GRF | Georeferencing | @GRF | | -| GRP | Grouping | @GRP | | -| IBP | Industry Best Practice | @IBP | Used for @industry-practice tag | -| IFC | IFC | @IFC | Validating correct IFC Schema | -| LIB | Library reference | @LIB | | -| LIP | Linear placement (non-geometric) | @LIP | | -| MAT | Materials | @MAT | | -| MDS | Model setup | @MDS | | -| OJP | Object placement | @OJP | | -| OJT | Object typing | @OJT | | -| PRP | Properties | @PRP | | -| PSE | Property Sets | @PSE | | -| SPS | Spatial structure | @SPS | Need to split SS aggregation and SS containment? | -| STN | Stationing | @STN | | -| SYS | | @SYS | | \ No newline at end of file +Below is the list of the IFC functional parts. + +| TAG | FUNCTIONAL PART | DESCRIPTION | +|-----|-----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PJS | Project definition | The ability to define the overall context and directory of objects within the model. Among others, the context definition includes default units and geometric representation context for shape representations. | +| GRF | Georeferencing | The ability to accurately define the geographic location and orientation of the model relative to a reference coordinate system, such as a national or global coordinate system. | +| BLT | Built elements (kickable) | The ability to model various building and infrastructure elements, including walls, floors, roofs, stairs, doors, windows, columns, road pavements, bridge decks, railway track elements, etc. | +| ASM | Assemblies (kickable) | The ability to model elements composed of / constructed by other elements. For example, a roof might be assembled from a series of prefabricated truss components. | +| SPA | Spaces (non-kickable) | The ability to model spaces, such as rooms, hallways, clearance zones, and circulation areas. | +| VRT | Virtual elements (non-kickable) | The ability to model spatial element used to provide imaginary, placeholder, or provisional areas (e.g. clearance), volumes, and boundaries. Virtual elements are not displayed, do not have quantities, materials, or other measures. | +| GEM | *Geometry representation | The ability to represent built elements and spaces using various geometry types, including parametric, mesh, and voxel-based representations. | +| OJP | *Object placement | The ability to define the location, orientation, and scale of built elements and systems within the building model. | +| POS | *Positioning elements | The ability to define (virtual) objects that are used to position other elements relatively. Includes grids, alignments, and referents. | +| OJT | Objects typing | The ability to define elements (and unfortunately not systems) based on their type or function within the model, allowing reusability of information by the occurrence of such types. | +| GRP | Groups (non-kickable) | The ability to group objects related by functional or logical criteria. Used, for example to model building systems, such as HVAC (heating, ventilation, and air conditioning) systems; to group assets that have the same maintenance schedule; to group all terminals of a fire-protection system. | +| SPS | Spatial breakdown | The ability to define spatial organisation within a building or infrastructure project. This includes the hierarchical relationships between spatial containers, such as buildings within a site, storeys within a building and rooms within a storey. | +| MAT | Materials | The ability to define materials assigned to elements. | +| PSE | Properties for object | The ability to define properties of elements and systems, such as their performance characteristics. | +| QTY | Quantities for objects | The ability to define quantities of elements, such as their dimensions, volume, area, weight. | +| CLS | Classification reference | The ability to classify elements, materials, and systems according to various classification systems, such as the UNIFORMAT or Omniclass classification systems. | +| ANN | Annotations | The ability to add annotations to elements and spaces, such as labels, notes, and dimensions. | +| LAY | Presentation layer | The ability to assign layers (also known as, CAD layer) to collection of elements. This is used mainly for grouping and visibility control, and in general to organise geometry into groups that may be shown or hidden. | +| CTX | Presentation Colours and Textures | The ability to assign colour, texture and other presentation appearance information to objects. | +| POR | Port connectivity & nesting | The ability to define ports (as means for an element to connect to other elements) and the relationship that is made between two ports. | +| STR | Structural items and actions | The ability to define structural members and structural connections, as analysis idealizations of built elements. And the ability to define actions (such as forces, displacements, etc.) and reactions (support reactions, internal forces, deflections, etc.) associated to structural items and specified by using the basic load definitions. | +| CST | Costing | The ability to assign costing information to objects. | +| SDL | Scheduling of activities | The ability to assign scheduling information to objects. | +| LIB | Library reference | The ability to associate library entities, such as from a product library or external database to objects and object types. | +| DOC | Documentation reference | The ability to associate reference to documentation to objects. | +| CTR | Constraints | The ability to model constraints on building elements, such as minimum and maximum dimensions or clearances, and to enforce these constraints during design and construction. | +| VER | Versioning / revision control | The ability to track changes to building data over time and to maintain a history of changes. | + +*These 3 functional parts are further decomposed as indicated below. + +### Geometry representation sub-parts + +| TAG | FUNCTIONAL PART | DESCRIPTION | +|-----|------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| AXG | Axis geometry | This involves representing the geometry using a set of axes, where each axis consists of a position in 3D space and a direction vector. This can be useful for representing geometry that follows a certain pattern or direction, such as walls, beams, columns, or other elements. In IFC, axis geometry can be represented using the IfcCartesianPoint and IfcDirection classes, which define the position and direction of the axes, respectively. | +| ALS | Alignment geometry | This involves representing the geometry using a collection of segments that define a linear path in 3D space. This can be useful for representing linear objects such as roads, railways, or pipelines. | +| PBG | Point-based geometry | This involves representing geometry using a collection of individual points in 3D space. Point-based geometry can be useful for representing large-scale environments or for creating simplified representations of more complex geometry. Point-based geometry can be represented in IFC using a range of different point types, such as 3D point clouds or scattered point data. | +| TAS | Tessellated (i.e. meshes) | This involves representing geometry using a collection of interconnected vertices, edges, and faces, which are used to approximate a smooth surface. Tessellated geometry can be useful for representing organic or irregular shapes, or for creating low-resolution representations of more complex geometry. In IFC, tessellated geometry can be represented using a range of different mesh types, such as triangular, quadrilateral, or polyhedral meshes. | +| BRP | Boundary Representation (BREP) | This involves representing geometry using a collection of connected surfaces and edges. BREP geometry can be used to represent complex shapes with curved surfaces or unusual topology. BREP geometry can be represented in IFC using IfcFacetedBrep for polygonal meshes or IfcManifoldSolidBrep for more complex solid geometry. These entities can be further described using a collection of geometric representations such as IfcCartesianPoint, IfcPolyLoop, and IfcSurface. | +| CSG | Constructive Solid Geometry (CSG) | This involves creating complex geometry by combining simpler shapes using Boolean operations such as union, intersection, and difference. CSG can be useful for creating complex shapes with predictable and repeatable geometry. CSG can be represented in IFC using the IfcBooleanResult entity, which defines the Boolean operation to be applied to a set of one or more shape representations. | +| SWE | Sweeps (i.e., extrusions, lofts, blends) | This involves taking a 2D shape (often called the "profile") and moving it along a 3D path, generating a 3D shape. The resulting shape is typically smooth and continuous, with its cross-section changing gradually along the length of the path. Sweep geometry can be useful for representing a variety of objects, such as pipes, cables, and architectural details like moldings. In IFC, sweep geometry can be represented using the IfcExtrudedAreaSolid, IfcRevolvedAreaSolid, and IfcSweptAreaSolid entities. | +| TFM | Transformations | Transformation geometry involves representing geometry using spatial transformations, such as rotations, translations, and scaling. It allows for the modification of existing geometry without the need to create new geometry from scratch. Transformation geometry can be used to represent various types of transformations, including cartesian transformations, placement transformations, and composite transformations, among others. These transformations can be applied to a range of geometric entities, including points, curves, surfaces, and solids, to create new or modified geometry. In IFC, transformation geometry is represented using the IfcCartesianTransformationOperator and IfcObjectPlacement entities. | +| BBX | Bounding box | This involves defining an orthogonal box, oriented parallel to the axes of the object coordinate system in which it is defined and containing a geometry object, which defines the spatial extent of the latter. | +| MPD | Mapped geometry | This involves identifying a representation and a representation item in that representation for the purpose of mapping. The representation item defines the origin of the mapping. The representation map is used as the source of a mapping by a mapped item. | +| RCO | Relational constructs | Such as connection geometry, space boundaries, interference geometries. This is not a geometry category per se, but it's a specific way geometry is used in IFC | +| CPD | Clipped representations | This involves visualizations of a 3D model where part of the model is "clipped" or cut away to allow for better examination of the internal structures or components. This is often done using clipping planes or sections. | + +### Object placement sub-parts + +| TAG | FUNCTIONAL PART | DESCRIPTION | +|-----|------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| LOP | Local placement | The ability to define the placement of a product in relation to the placement of another product; or its absolute placement within the geometric representation context of the project. | +| LIP | Linear placement | The ability to define the placement of a product in relation to a curve. | +| GDP | Grid placement | The ability to define the placement of a product in relation to a design grid. | + +### Positioning elements sub-parts + +| TAG | FUNCTIONAL PART | DESCRIPTION | +|----------|-----------------|--------------------------------------------------------------------------------------------------------------------| +| GRD | Grid | The ability to define a design grid to be used as reference for object placement. | +| ALA, ALB | Alignment | The ability to define an alignment curve, and its components. These can be used as reference for object placement. | +| RFT | Referent | The ability to define a referent to be used as reference for object placement. | + diff --git a/docs/dev/gherkin_deep_dive.md b/docs/dev/gherkin_deep_dive.md index 1050eab0..67a40820 100644 --- a/docs/dev/gherkin_deep_dive.md +++ b/docs/dev/gherkin_deep_dive.md @@ -1,9 +1,36 @@ # A deep dive into gherkin rule implementations -TODO: Ghesselink +## Decorators -## Decorator +### `@gherkin_ifc` + +This is used in place of `behave`'s default `@step_implementation` decorator +to provide additional capabilities related to context stacking and other concerns +related to tracking and evaluating instances in the IFC model. + +### `@register_enum_type` + +This is a small new decorator for registering enumeration types in a simpler way. + +## Step handling + +### `execute_step()` + +Checks whether the current step being processed is a `Given` or `Then`. + +### `handle_given()` + +Handles a `Given` step. + +### `handle_then()` + +Handles a `Then` step. ## Context stacking -## Validaton Outcomes +As steps are processed, they are captured in a persistent object of type `behave.runner.Context`. +This context object includes a hidden attribute `_stack` that is used to 'stack' information +and results for each step that is processed. + +It can be helpful to monitor the content of the `instances` attribute of each item in the +`context._stack` list. diff --git a/docs/dev/rule_details.md b/docs/dev/rule_details.md index 552c71f1..6dde7a1b 100644 --- a/docs/dev/rule_details.md +++ b/docs/dev/rule_details.md @@ -267,7 +267,8 @@ Given A model with Schema "IFC4.3" #### Must vs Shall -Use **must**, not **shall** to impose requirements.[ALB001_Alignment-in-spatial-structure.feature](ALB001_Alignment-in-spatial-structure.feature) +Use **must**, not **shall** to impose requirements. +[ALB001_Alignment-in-spatial-structure.feature](https://github.com/buildingSMART/ifc-gherkin-rules/blob/main/features/ALB002_Alignment-layout.feature) "Shall" is ambiguous, also in the legal field the community is moving to a strong preference for “must” as the clearest way to express a requirement or obligation.

wrong @@ -288,6 +289,7 @@ Then There must be exactly 1 IfcSite element(s)
#### Verbs for IFC relationships + When a rule requires a specific IFC relationship to exist, refer to the table below for the right verb to be used. | IFC relationship | Verb for rules | Examples | @@ -298,6 +300,7 @@ When a rule requires a specific IFC relationship to exist, refer to the table be #### Reference for schema versioning + Rules that are applicable only to specific schema versions must specify the schema version with the initial `Given` statement. diff --git a/docs/ref/index.md b/docs/ref/index.md index 1c99759e..73f8e13d 100644 --- a/docs/ref/index.md +++ b/docs/ref/index.md @@ -1 +1,8 @@ -# Reference Information \ No newline at end of file +# Reference Information + +## Additional Information for Normative Rules + +```{include} ./normative-rules/ALA001.md +:heading-offset: 0 +:relative-images: +``` diff --git a/docs/ref/normative-rules/ALA001.md b/docs/ref/normative-rules/ALA001.md new file mode 100644 index 00000000..878f9753 --- /dev/null +++ b/docs/ref/normative-rules/ALA001.md @@ -0,0 +1,39 @@ +### ALA001 + +The implementer agreements validated by this rule are captured in three concept templates: + +- [4.1.7.1.1.1 Alignment Geometry - Horizontal](https://standards.buildingsmart.org/IFC/RELEASE/IFC4_3/HTML/concepts/Product_Shape/Product_Geometric_Representation/Alignment_Geometry/Alignment_Geometry_-_Horizontal/content.html) +- [4.1.7.1.1.2 Alignment Geometry - Horizontal and Vertical](https://standards.buildingsmart.org/IFC/RELEASE/IFC4_3/HTML/concepts/Product_Shape/Product_Geometric_Representation/Alignment_Geometry/Alignment_Geometry_-_Horizontal_and_Vertical/content.html) +- [4.1.7.1.1.3 Alignment Geometry - Horizontal, Vertical and Cant](https://standards.buildingsmart.org/IFC/RELEASE/IFC4_3/HTML/concepts/Product_Shape/Product_Geometric_Representation/Alignment_Geometry/Alignment_Geometry_-_Horizontal,_Vertical_and_Cant/content.html) + +#### Case 1 - Horizontal Alignment Only + + - Only 1 IfcShapeRepresentation + - IfcShapeRepresentation + - Item: IfcCompositeCurve + - RepresentationIdentifier = `Axis` + - RepresentationType = `Curve2D` + +#### Case 2 - Horizontal and Vertical Alignment + + - 2 IfcShapeRepresentations + - First IfcShapeRepresentation + - Item: IfcCompositeCurve + - RepresentationIdentifier = `FootPrint` + - RepresentationType = `Curve2D` + - Second IfcShapeRepresentation + - Item: IfcGradientCurve (using IfcCompositeCurve as BaseCurve) + - RepresentationIdentifier = `Axis` + - RepresentationType = `Curve3D` + +#### Case 3 - Horizontal, Vertical, and Cant Alignment + +- 2 IfcShapeRepresentations + - First IfcShapeRepresentation + - Item: IfcCompositeCurve + - RepresentationIdentifier = `FootPrint` + - RepresentationType = `Curve2D` + - Second IfcShapeRepresentation + - Item: IfcSegmentedReferenceCurve (using IfcGradientCurve as BaseCurve) + - RepresentationIdentifier = `Axis` + - RepresentationType = `Curve3D` \ No newline at end of file diff --git a/docs/user/using.md b/docs/user/using.md index c69fcb18..70dc8257 100644 --- a/docs/user/using.md +++ b/docs/user/using.md @@ -30,7 +30,7 @@ At this time the service will only accept non-zipped STEP physical files having ### Color codes and icons -```{image} ../_static/user_results_icons.png +```{image} ../_static/user_results_icons_no_bSDD.png :alt: Color codes and icons displayed by the service :scale: 80 % :align: center diff --git a/docs/user/validation_overview.md b/docs/user/validation_overview.md index f39c10af..7d25594a 100644 --- a/docs/user/validation_overview.md +++ b/docs/user/validation_overview.md @@ -63,5 +63,7 @@ Therefore, any issues identified result in warnings rather than errors. ### buildingSMART Data Dictionary (bSDD) Compliance -This step includes checking whether references to classifications and properties from bSDD -found in an IFC file comply the source definitions in bSDD. +```{note} +bSDD Checks are temporarily disabled as of v0.6.6. +``` + From ee8478f10acc1abfcde44f58cd9ac53130d1e85d Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Sun, 22 Sep 2024 14:51:50 -0400 Subject: [PATCH 25/45] Finish edits for IVS-125 v0.6.6 documentation updates --- docs/dev/ifc_gherkin_rules_readme.md | 5 +++-- docs/ref/index.md | 5 +++++ docs/ref/normative-rules/ALA001.md | 10 +++++----- docs/ref/normative-rules/ALS016.md | 17 +++++++++++++++++ docs/user/index.md | 2 +- 5 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 docs/ref/normative-rules/ALS016.md diff --git a/docs/dev/ifc_gherkin_rules_readme.md b/docs/dev/ifc_gherkin_rules_readme.md index ed24d942..88aa539f 100644 --- a/docs/dev/ifc_gherkin_rules_readme.md +++ b/docs/dev/ifc_gherkin_rules_readme.md @@ -2,13 +2,14 @@ ## Usage as part of buildingSMART validation service -This repository is one of three submodules in the overall validation service. See (application_structure) for more information. +This repository is one of three submodules in the overall validation service. +See [application_structure](#application-structure) for more information. ## Making changes The rules developed in this repository follow the general ideas of Gherkin and its python implementation behave. -This means there are human readable definitions of rules and Python implementations. +This means there are human-readable definitions of rules and Python implementations. A third component of this repository are minimal sample files with expected outcomes, which means that extensions and modifications can be suggested with confidence of not breaking existing functionality. diff --git a/docs/ref/index.md b/docs/ref/index.md index 73f8e13d..b6b775e8 100644 --- a/docs/ref/index.md +++ b/docs/ref/index.md @@ -6,3 +6,8 @@ :heading-offset: 0 :relative-images: ``` + +```{include} ./normative-rules/ALS016.md +:heading-offset: 0 +:relative-images: +``` diff --git a/docs/ref/normative-rules/ALA001.md b/docs/ref/normative-rules/ALA001.md index 878f9753..17aca9ea 100644 --- a/docs/ref/normative-rules/ALA001.md +++ b/docs/ref/normative-rules/ALA001.md @@ -1,12 +1,12 @@ -### ALA001 +# ALA001 -The implementer agreements validated by this rule are captured in three concept templates: +This normative rule validates the three implementer agreements captured in three concept templates: - [4.1.7.1.1.1 Alignment Geometry - Horizontal](https://standards.buildingsmart.org/IFC/RELEASE/IFC4_3/HTML/concepts/Product_Shape/Product_Geometric_Representation/Alignment_Geometry/Alignment_Geometry_-_Horizontal/content.html) - [4.1.7.1.1.2 Alignment Geometry - Horizontal and Vertical](https://standards.buildingsmart.org/IFC/RELEASE/IFC4_3/HTML/concepts/Product_Shape/Product_Geometric_Representation/Alignment_Geometry/Alignment_Geometry_-_Horizontal_and_Vertical/content.html) - [4.1.7.1.1.3 Alignment Geometry - Horizontal, Vertical and Cant](https://standards.buildingsmart.org/IFC/RELEASE/IFC4_3/HTML/concepts/Product_Shape/Product_Geometric_Representation/Alignment_Geometry/Alignment_Geometry_-_Horizontal,_Vertical_and_Cant/content.html) -#### Case 1 - Horizontal Alignment Only +## Case 1 - Horizontal Alignment Only - Only 1 IfcShapeRepresentation - IfcShapeRepresentation @@ -14,7 +14,7 @@ The implementer agreements validated by this rule are captured in three concept - RepresentationIdentifier = `Axis` - RepresentationType = `Curve2D` -#### Case 2 - Horizontal and Vertical Alignment +## Case 2 - Horizontal and Vertical Alignment - 2 IfcShapeRepresentations - First IfcShapeRepresentation @@ -26,7 +26,7 @@ The implementer agreements validated by this rule are captured in three concept - RepresentationIdentifier = `Axis` - RepresentationType = `Curve3D` -#### Case 3 - Horizontal, Vertical, and Cant Alignment +## Case 3 - Horizontal, Vertical, and Cant Alignment - 2 IfcShapeRepresentations - First IfcShapeRepresentation diff --git a/docs/ref/normative-rules/ALS016.md b/docs/ref/normative-rules/ALS016.md new file mode 100644 index 00000000..fc51f33f --- /dev/null +++ b/docs/ref/normative-rules/ALS016.md @@ -0,0 +1,17 @@ +# ALS016 + +This industry best practice rule performs geometric calculations to assess geometric continuity between +successive `IfcCurveSegment` entities that make up an alignment representation. + +This rule checks the shape representation (geometry) only and does not +utilize any information in the semantic (business logic) definition of the alignment. + +The `Transition` attribute on +[`IfcCurveSegment`](https://standards.buildingsmart.org/IFC/RELEASE/IFC4_3/HTML/lexical/IfcCurveSegment.htm) +is utilized to determine the model author's intended +continuity between segments. + +A value of `.CONTINUOUS.` would mean that a warning for ALS016 could be raised positional discontinuity only +(not tangency). +Similarly, a value of `.DISCONTINUOUS.` would mean that a warning for ALS016 could not be raised, +full stop. \ No newline at end of file diff --git a/docs/user/index.md b/docs/user/index.md index 6f6d65f7..16c7613d 100644 --- a/docs/user/index.md +++ b/docs/user/index.md @@ -2,7 +2,7 @@ ## Introduction -Data validation is a key component of openBIM(r) workflows. +Data validation is a key component of openBIM® workflows. The IFC Validation Services allows users to check the validity of their IFC models against the IFC standard. From e9d5a585454852609f513de2f6b2a84bc0236cdf Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Sun, 22 Sep 2024 15:11:44 -0400 Subject: [PATCH 26/45] fix header offset for rule details --- docs/ref/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/ref/index.md b/docs/ref/index.md index b6b775e8..d1ae7940 100644 --- a/docs/ref/index.md +++ b/docs/ref/index.md @@ -3,11 +3,11 @@ ## Additional Information for Normative Rules ```{include} ./normative-rules/ALA001.md -:heading-offset: 0 +:heading-offset: 1 :relative-images: ``` ```{include} ./normative-rules/ALS016.md -:heading-offset: 0 +:heading-offset: 1 :relative-images: ``` From 27dc86e3cf5ca6896ce618254c62c38d2bd5a0ad Mon Sep 17 00:00:00 2001 From: Scott Lecher Date: Fri, 27 Sep 2024 16:38:43 -0400 Subject: [PATCH 27/45] Update branch name in build-docs.yml --- .github/workflows/build-docs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 32b3deba..f1f25772 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -2,7 +2,7 @@ name: "Build docs with Sphinx" on: pull_request: - branches: gh-pages + branches: docs/gh-pages jobs: build_and_deploy: @@ -25,4 +25,4 @@ jobs: uses: actions/upload-pages-artifact@v3 with: # Upload html docs - path: './docs/_build/html' \ No newline at end of file + path: './docs/_build/html' From 9a04aec0af4d65377900a8a1d3ec7d3c6ab3f834 Mon Sep 17 00:00:00 2001 From: Scott Lecher Date: Fri, 27 Sep 2024 16:39:08 -0400 Subject: [PATCH 28/45] Update branch name in build-and-deploy-docs.yml --- .github/workflows/build-and-deploy-docs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-deploy-docs.yml b/.github/workflows/build-and-deploy-docs.yml index 4033b446..172fbd66 100644 --- a/.github/workflows/build-and-deploy-docs.yml +++ b/.github/workflows/build-and-deploy-docs.yml @@ -2,7 +2,7 @@ name: "Build docs with Sphinx and deploy to Github Pages" on: push: - branches: gh-pages + branches: docs/gh-pages jobs: build_and_deploy: @@ -28,4 +28,4 @@ jobs: path: './docs/_build/html' - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 \ No newline at end of file + uses: actions/deploy-pages@v4 From f05142bcb39dcb7373edf6570ec4ee8a6069536e Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Sat, 5 Oct 2024 10:00:15 -0400 Subject: [PATCH 29/45] rename ALA001 to ALB021 in docs This was required to keep the documentation in sync with the rules on the Validation Service platform (IVS-145) --- docs/ref/index.md | 2 +- docs/ref/normative-rules/{ALA001.md => ALB021.md} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename docs/ref/normative-rules/{ALA001.md => ALB021.md} (99%) diff --git a/docs/ref/index.md b/docs/ref/index.md index d1ae7940..d1991f5e 100644 --- a/docs/ref/index.md +++ b/docs/ref/index.md @@ -2,7 +2,7 @@ ## Additional Information for Normative Rules -```{include} ./normative-rules/ALA001.md +```{include} ./normative-rules/ALB021.md :heading-offset: 1 :relative-images: ``` diff --git a/docs/ref/normative-rules/ALA001.md b/docs/ref/normative-rules/ALB021.md similarity index 99% rename from docs/ref/normative-rules/ALA001.md rename to docs/ref/normative-rules/ALB021.md index 17aca9ea..c05080f5 100644 --- a/docs/ref/normative-rules/ALA001.md +++ b/docs/ref/normative-rules/ALB021.md @@ -1,4 +1,4 @@ -# ALA001 +# ALB021 This normative rule validates the three implementer agreements captured in three concept templates: From 3e3496b226ca895aefdce7ad4a3d9b50b6b1f40d Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Sat, 2 Nov 2024 22:24:29 -0400 Subject: [PATCH 30/45] clean up alignment continuity reporting --- frontend/src/GherkinResult.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/src/GherkinResult.js b/frontend/src/GherkinResult.js index 7fcf6e52..b63f542c 100644 --- a/frontend/src/GherkinResult.js +++ b/frontend/src/GherkinResult.js @@ -66,7 +66,8 @@ function unsafe_format(obj) { directionLabel = 'Gradient'; } else { - directionLabel= ''; + // warning is raised for position, so don't report any details of direction or gradient + directionLabel= 'suppress'; } if ('continuity_details' in obj) { @@ -76,11 +77,13 @@ function unsafe_format(obj) {
{ctx} {display_value}
at end of {dts.previous_segment}
    Coords: ({dts.preceding_end_point[0]}, {dts.preceding_end_point[1]})
-
    {directionLabel}: {dts.preceding_end_direction}
+ { directionLabel !== 'suppress' && ( +
    {directionLabel}: {dts.preceding_end_direction}
) }
and start of {dts.segment_to_analyze}
    Coords: ({dts.current_start_point[0]}, {dts.current_start_point[1]})
-
    {directionLabel}: {dts.current_start_direction}
+ { directionLabel !== 'suppress' && ( +
    {directionLabel}: {dts.current_start_direction}
)} ); } else { From 2777342b31db5f5a5901e8320f04f82cddbd2b60 Mon Sep 17 00:00:00 2001 From: Raphael <155643707+rw-bsi@users.noreply.github.com> Date: Sun, 3 Nov 2024 15:47:08 +0000 Subject: [PATCH 31/45] updated pre/postfix formatting --- frontend/src/GherkinResult.js | 8 +++++--- frontend/src/SchemaResult.js | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/frontend/src/GherkinResult.js b/frontend/src/GherkinResult.js index 7fcf6e52..89f69f7d 100644 --- a/frontend/src/GherkinResult.js +++ b/frontend/src/GherkinResult.js @@ -174,8 +174,9 @@ export default function GherkinResult({ summary, content, status, instances }) { setGrouped(grouped) }, [page, content, checked]); - function getSuffix(rows) { - return (rows && rows.length > 0) ? '(failed ' + rows.length.toLocaleString() + ' times)' : '' + function getSuffix(rows, status) { + let times = (rows && rows.length > 1) ? ' times' : ' time'; + return (rows && rows.length > 0 && rows[0].severity >= 4) ? '(failed ' + rows.length.toLocaleString() + times + ')' : ''; } return ( @@ -214,6 +215,7 @@ export default function GherkinResult({ summary, content, status, instances }) { ".MuiTreeItem-content.Mui-expanded": { borderBottom: 'solid 1px black' }, ".MuiTreeItem-group .MuiTreeItem-content.Mui-expanded": { borderBottom: 0 }, ".caption" : { paddingTop: "1em", paddingBottom: "1em", textTransform: 'capitalize' }, + ".caption-suffix" : { paddingTop: "1em", paddingBottom: "1em", fontSize: '0.9em', textTransform: 'none', fontStyle: 'italic' }, ".subcaption" : { visibility: "hidden", fontSize: '80%' }, ".MuiTreeItem-content.Mui-expanded .subcaption" : { visibility: "visible" }, "table": { borderCollapse: 'collapse', fontSize: '80%' }, @@ -237,7 +239,7 @@ export default function GherkinResult({ summary, content, status, instances }) { > {feature} {getSuffix(rows)}} + label={
{feature} {getSuffix(rows, status)}
} sx={{ "backgroundColor": severityToColor[severity] }} >
diff --git a/frontend/src/SchemaResult.js b/frontend/src/SchemaResult.js index ae595fa8..4a7e4a98 100644 --- a/frontend/src/SchemaResult.js +++ b/frontend/src/SchemaResult.js @@ -56,8 +56,9 @@ export default function SchemaResult({ summary, content, status, instances }) { setGrouped(grouped) }, [page, content, checked]); - function getSuffix(rows) { - return (rows && rows.length > 0) ? '(failed ' + rows.length.toLocaleString() + ' times)' : '' + function getSuffix(rows, status) { + let times = (rows && rows.length > 1) ? ' times' : ' time'; + return (rows && rows.length > 0 && rows[0].severity >= 4) ? '(failed ' + rows.length.toLocaleString() + times + ')' : ''; } return ( @@ -98,6 +99,7 @@ export default function SchemaResult({ summary, content, status, instances }) { ".MuiTreeItem-content.Mui-expanded": { borderBottom: 'solid 1px black' }, ".MuiTreeItem-group .MuiTreeItem-content.Mui-expanded": { borderBottom: 0 }, ".caption" : { paddingTop: "1em", paddingBottom: "1em", textTransform: 'capitalize' }, + ".caption-suffix" : { paddingTop: "1em", paddingBottom: "1em", fontSize: '0.9em', textTransform: 'none', fontStyle: 'italic' }, ".subcaption" : { visibility: "hidden", fontSize: '80%' }, ".MuiTreeItem-content.Mui-expanded .subcaption" : { visibility: "visible" }, "table": { borderCollapse: 'collapse', fontSize: '80%' }, @@ -115,7 +117,7 @@ export default function SchemaResult({ summary, content, status, instances }) { defaultCollapseIcon={} defaultExpandIcon={} > -
{(rows[0].constraint_type || '').replace('_', ' ')}{rows[0].constraint_type && ' - '}{hd} {getSuffix(rows)}
{rows[0].constraint_type !== 'schema' ? (coerceToStr(rows[0].msg)).split('\n')[0] : ''}
} +
{(rows[0].constraint_type || '').replace('_', ' ')}{rows[0].constraint_type && ' - '}{hd} {getSuffix(rows, status)}
{rows[0].constraint_type !== 'schema' ? (coerceToStr(rows[0].msg)).split('\n')[0] : ''}
} sx={{ "backgroundColor": severityToColor[rows[0].severity] }} > From 34be62b94106d96d00b723e3b1e2fef32effb6af Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Mon, 4 Nov 2024 00:41:55 -0500 Subject: [PATCH 32/45] update ifcopenshell version for ALS016 fix --- backend/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/Makefile b/backend/Makefile index 9d7202a1..baf435af 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -13,7 +13,7 @@ install: venv . $(VIRTUAL_ENV)/bin/activate && \ pip install --upgrade pip && \ pip install -r requirements.txt && \ - wget -O /tmp/ifcopenshell_python.zip "https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.7.9-c18e4ea-linux64.zip" && \ + wget -O /tmp/ifcopenshell_python.zip "https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.8.1-92b63a0-linux64.zip" && \ mkdir -p $(VIRTUAL_ENV)/lib/python3.11/site-packages && \ unzip -f -d $(VIRTUAL_ENV)/lib/python3.11/site-packages /tmp/ifcopenshell_python.zip && \ rm /tmp/ifcopenshell_python.zip @@ -22,7 +22,7 @@ install-macos: venv . $(VIRTUAL_ENV)/bin/activate && \ pip install --upgrade pip && \ pip install -r requirements.txt && \ - wget -O /tmp/ifcopenshell_python.zip "https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.7.9-c18e4ea-macos64.zip" && \ + wget -O /tmp/ifcopenshell_python.zip "https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.8.1-92b63a0-macos64.zip" && \ mkdir -p $(VIRTUAL_ENV)/lib/python3.11/site-packages && \ unzip /tmp/ifcopenshell_python.zip -d .dev/venv/lib/python3.11/site-packages && \ rm /tmp/ifcopenshell_python.zip From 462261e642c84f7ce2b6f61c8312ea211f972987 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 4 Nov 2024 14:07:07 +0000 Subject: [PATCH 33/45] Update of submodules (bSI-Bot via GH action) --- backend/apps/ifc_validation/checks/ifc_gherkin_rules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/apps/ifc_validation/checks/ifc_gherkin_rules b/backend/apps/ifc_validation/checks/ifc_gherkin_rules index e9f4441c..ab06224d 160000 --- a/backend/apps/ifc_validation/checks/ifc_gherkin_rules +++ b/backend/apps/ifc_validation/checks/ifc_gherkin_rules @@ -1 +1 @@ -Subproject commit e9f4441c9a20b8d446918cae711892905ccebabe +Subproject commit ab06224ded192c1ac63e361fffc58dbf94aded27 From 051a6bc5eb0d23d24731881090eaf95bb70a7ba9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 4 Nov 2024 14:15:32 +0000 Subject: [PATCH 34/45] Update of submodules (bSI-Bot via GH action) --- backend/apps/ifc_validation/checks/ifc_gherkin_rules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/apps/ifc_validation/checks/ifc_gherkin_rules b/backend/apps/ifc_validation/checks/ifc_gherkin_rules index ab06224d..3309ad29 160000 --- a/backend/apps/ifc_validation/checks/ifc_gherkin_rules +++ b/backend/apps/ifc_validation/checks/ifc_gherkin_rules @@ -1 +1 @@ -Subproject commit ab06224ded192c1ac63e361fffc58dbf94aded27 +Subproject commit 3309ad29a6279e672875ea52bea33b504e9ed2e4 From bde4622bf9e8fa168f307588b36faefc7b2e6101 Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Mon, 4 Nov 2024 09:42:25 -0500 Subject: [PATCH 35/45] update ifcopenshell version in Dockerfile also --- docker/backend/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/backend/Dockerfile b/docker/backend/Dockerfile index f8433795..08dbbaf4 100644 --- a/docker/backend/Dockerfile +++ b/docker/backend/Dockerfile @@ -37,7 +37,7 @@ RUN --mount=type=cache,target=/root/.cache \ pip install --no-cache-dir -r /app/backend/requirements.txt && \ # use version of ifcopenshell with desired schema parsing # TODO: revert to pyPI when schema parsing is published in the future - wget -O /tmp/ifcopenshell_python.zip "https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.7.9-c18e4ea-linux64.zip" && \ + wget -O /tmp/ifcopenshell_python.zip "https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.8.1-92b63a0-linux64.zip" && \ mkdir -p /opt/venv/lib/python3.11/site-packages && \ unzip -d /opt/venv/lib/python3.11/site-packages /tmp/ifcopenshell_python.zip && \ # some cleanup From a6e0a0d3888cfec40c8a36d95b96dc18c7a557bc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 6 Nov 2024 17:20:21 +0000 Subject: [PATCH 36/45] Update of submodules (bSI-Bot via GH action) --- backend/apps/ifc_validation/checks/ifc_gherkin_rules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/apps/ifc_validation/checks/ifc_gherkin_rules b/backend/apps/ifc_validation/checks/ifc_gherkin_rules index 3309ad29..e36a2df5 160000 --- a/backend/apps/ifc_validation/checks/ifc_gherkin_rules +++ b/backend/apps/ifc_validation/checks/ifc_gherkin_rules @@ -1 +1 @@ -Subproject commit 3309ad29a6279e672875ea52bea33b504e9ed2e4 +Subproject commit e36a2df51f515487f82e0aeb1ccb0bf100c6c977 From eeab09ee363864bac306a908af487736647682e1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 7 Nov 2024 13:02:04 +0000 Subject: [PATCH 37/45] Update of submodules (bSI-Bot via GH action) --- backend/apps/ifc_validation/checks/ifc_gherkin_rules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/apps/ifc_validation/checks/ifc_gherkin_rules b/backend/apps/ifc_validation/checks/ifc_gherkin_rules index e36a2df5..316e1c17 160000 --- a/backend/apps/ifc_validation/checks/ifc_gherkin_rules +++ b/backend/apps/ifc_validation/checks/ifc_gherkin_rules @@ -1 +1 @@ -Subproject commit e36a2df51f515487f82e0aeb1ccb0bf100c6c977 +Subproject commit 316e1c174ad196e3969129e12eb77b74f342be81 From 2d706c69bfd2d58ba38b5db84a179882bd51c2b7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 7 Nov 2024 13:26:54 +0000 Subject: [PATCH 38/45] Update of submodules (bSI-Bot via GH action) --- backend/apps/ifc_validation/checks/ifc_gherkin_rules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/apps/ifc_validation/checks/ifc_gherkin_rules b/backend/apps/ifc_validation/checks/ifc_gherkin_rules index 316e1c17..24294494 160000 --- a/backend/apps/ifc_validation/checks/ifc_gherkin_rules +++ b/backend/apps/ifc_validation/checks/ifc_gherkin_rules @@ -1 +1 @@ -Subproject commit 316e1c174ad196e3969129e12eb77b74f342be81 +Subproject commit 242944946b45e7aacd6a7ba0bb15c704d97caee0 From 0b7b9f639459dfe81e1a6181298fa9530980194a Mon Sep 17 00:00:00 2001 From: Geert Hesselink <54070862+Ghesselink@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:33:24 +0100 Subject: [PATCH 39/45] Update Makefile https://github.com/buildingSMART/validate/commit/888fe129b52557145e2219401fb682a24f6352a2#diff-76ed074a9305c04054cdebb9e9aad2d818052b07091de1f20cad0bbac34ffb52R75 --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index dc65941d..01236f8a 100644 --- a/Makefile +++ b/Makefile @@ -71,4 +71,5 @@ clean-all: fetch-modules: git submodule update --init --recursive - git submodule update --remote \ No newline at end of file + git submodule foreach git clean -f . + git submodule update --remote --recursive From 6b536d2345ba9b139f99a4210f8aef87d3ac9db6 Mon Sep 17 00:00:00 2001 From: Geert Hesselink Date: Thu, 7 Nov 2024 18:48:23 +0100 Subject: [PATCH 40/45] Trigger deployment From d00c40ec472c71028f84a93c810807b45e40091d Mon Sep 17 00:00:00 2001 From: Raphael <155643707+rw-bsi@users.noreply.github.com> Date: Sat, 9 Nov 2024 14:53:07 +0000 Subject: [PATCH 41/45] Update ci_cd.yml --- .github/workflows/ci_cd.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index 7a3fad07..a8ba9a79 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -79,7 +79,16 @@ jobs: source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt - pip install ifcopenshell # TEMP workaround + + - name: Install ifcopenshell package (temp) + run: | + cd backend + source venv/bin/activate + # use version of ifcopenshell with desired schema parsing + # TODO: revert to pyPI when schema parsing is published in the future + wget -O /tmp/ifcopenshell_python.zip "https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-311-v0.8.1-92b63a0-linux64.zip" + mkdir -p venv/lib/python3.11/site-packages + unzip -d venv/lib/python3.11/site-packages /tmp/ifcopenshell_python.zip - name: Check Django config run: | From 6bcf6c2d385f5c4516813e198d6447c1f409c866 Mon Sep 17 00:00:00 2001 From: Raphael <155643707+rw-bsi@users.noreply.github.com> Date: Sat, 9 Nov 2024 14:53:19 +0000 Subject: [PATCH 42/45] Update Makefile --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 01236f8a..716716a0 100644 --- a/Makefile +++ b/Makefile @@ -72,4 +72,5 @@ clean-all: fetch-modules: git submodule update --init --recursive git submodule foreach git clean -f . + git submodule foreach git reset --hard git submodule update --remote --recursive From 551c381be901fe26d42421ac8a7a96a94492d5c7 Mon Sep 17 00:00:00 2001 From: Raphael <155643707+rw-bsi@users.noreply.github.com> Date: Sat, 9 Nov 2024 15:03:20 +0000 Subject: [PATCH 43/45] Update Makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 716716a0..96403781 100644 --- a/Makefile +++ b/Makefile @@ -72,5 +72,5 @@ clean-all: fetch-modules: git submodule update --init --recursive git submodule foreach git clean -f . - git submodule foreach git reset --hard + git submodule foreach git reset --hard git submodule update --remote --recursive From fd6b6b02ec73847d514815231b00e5a6fa9f1f7e Mon Sep 17 00:00:00 2001 From: Raphael <155643707+rw-bsi@users.noreply.github.com> Date: Sat, 9 Nov 2024 16:18:54 +0000 Subject: [PATCH 44/45] Update tasks.py Catches segfaults invoking ifcopenshell.open() --- backend/apps/ifc_validation/tasks.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/backend/apps/ifc_validation/tasks.py b/backend/apps/ifc_validation/tasks.py index 81f64e00..d5904ffd 100644 --- a/backend/apps/ifc_validation/tasks.py +++ b/backend/apps/ifc_validation/tasks.py @@ -330,6 +330,17 @@ def parse_info_subtask(self, prev_result, id, file_name, *args, **kwargs): task.mark_as_initiated() + # try to open IFC file (catch segfaults) + try: + code = "import ifcopenshell; ifcopenshell.open('" + file_path + "')" + check_program = [sys.executable, '-c', code, file_path] + logger.debug(f'Command for {self.__qualname__}: {" ".join(check_program)}') + subprocess.run(check_program, check=True) + + except subprocess.CalledProcessError as err: + task.mark_as_failed(err) + raise + # retrieve IFC info try: task.set_process_details(None, f"(module) ifcopenshell.open() for file '{file_path}')") From 730c1047f50aebfe772a47dc67de34036d23cc6f Mon Sep 17 00:00:00 2001 From: civilx64 <26513472+civilx64@users.noreply.github.com> Date: Tue, 12 Nov 2024 08:46:18 -0500 Subject: [PATCH 45/45] Add Developer documentation for validation outcome severities --- docs/dev/outcome_severities.md | 151 +++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 docs/dev/outcome_severities.md diff --git a/docs/dev/outcome_severities.md b/docs/dev/outcome_severities.md new file mode 100644 index 00000000..cf6ccc28 --- /dev/null +++ b/docs/dev/outcome_severities.md @@ -0,0 +1,151 @@ +# Outcome Severities + +Note: This documentation was developed in Nov 2024 based on the codebase at version 0.6.8. + +## Overview - Database model enumerations + +Severities are an enumeration of possible values for the severity of a +[Validation Outcome](https://github.com/buildingSMART/ifc-validation-data-model/blob/main/models.py#L978). + +| String Value | Integer Enumeration Value | +|----------------|---------------------------| +| EXECUTED | 1 | +| PASSED | 2 | +| WARNING | 3 | +| ERROR | 4 | +| NOT_APPLICABLE | 0 | + +## Severity Usage + +### Schema Check + +Schema checks are always applicable and therefore the only possible enumeration values are `PASSED` and `ERROR`. +[Passing outcomes for schema checks are stored to the database](https://github.com/buildingSMART/validate/blob/8f04bcc6d1f400240485a33b2c81e2f7d0edbeab/backend/apps/ifc_validation/tasks.py#L607). + +### Syntax Check + +Syntax checks are also always applicable and therefore the only possible enumeration values are `PASSED` and `ERROR`. +[Passing outcomes for syntax checks are stored to the database](https://github.com/buildingSMART/validate/blob/8f04bcc6d1f400240485a33b2c81e2f7d0edbeab/backend/apps/ifc_validation/tasks.py#L607). + +### Gherkin Rules (Normative Rules and Industry Best Practices) + +These rules are generally processed in similar fashion. +Unlike syntax and schema checks, a gherkin rule may or may not be applicable to a given model depending on the schema +and content of the model. +For example, alignment rules are only applicable to models with schema `IFC4X3_ADD2` as those entities were not part of +the +`IFC2X3` or `IFC4` schema versions. + +Therefore, both sets of validation checks can potentially also return outcomes with severity of `NOT_APPLICABLE`. + +#### Normative Rules + +Normative rules enforce requirements from implementer agreements and informal propositions. +Therefore, the potential outcomes are: + +- `NOT_APPLICABLE` +- `ERROR` +- `PASSED` + +#### Industry Best Practices + +Industry Best Practice checks enforce items that are not required, +but rather represent the preferred or most idiomatic way of implementing the IFC standard. + +Therefore, the potential outcomes are: + +- `NOT_APPLICABLE` +- `WARNING` +- `PASSED` + +#### Gherkin Rule processing + +Currently there are no individual instance outcomes from gherkin rules stored with severity=`PASSED`. +The initial idea was to pass them to the DB but it was quickly flooded with outcomes of this severity +and is currently [commented out](https://github.com/buildingSMART/ifc-gherkin-rules/blob/b363041433f252fc1b9e043ee3aac0bd6fcfad3d/features/steps/validation_handling.py#L254-L268). + +_(potentially remove the following paragraph to avoid confusion...)_ + +When processing gherkin rules (*.feature files) with `behave`, Severity=`PASSED` is used only for `Given` statements. +A `PASSED` outcome is added to the temporary outcomes when the conditions of a `Given` statement are met. + +The entire processing loop is as follows: + +1. Severity=`NOT_APPLICABLE` is applied to all entity instances +2. The `Given` statements are executed +3. If there is *at least one* entity instance that meets the requirement of *ALL* `Given` statements, + the rule is considered to be "activated" and severity=`EXECUTED` is applied to these instance(s). + This is an 'all or nothing' situation where all `Given` statements must be "activated" in order for the rule + to be considered "activated". +4. Those instance(s) are then tested against the `Then` statements. +5. Severity=`ERROR` is applied to each instance that fails a requirement of a `Then` statement. + +If there is at least one instance with an `ERROR` outcome then an aggregated status for the rule is returned as follows: + +- Severity=`ERROR` for normative rules (implementer agreements and informal propositions) +- Severity=`WARNING` for industry best practices. + +This status is used to colour the "block" for each rule in the validation report. + +## Outcome display and reporting + +### Individual rules (Normative and Industry Best Practices) + +Outcomes are always reported in the web UI based on aggregated status of all instances +activated by a given rule. + +| Aggregated Value of `Severity` for a rule | Display colour | Label reported in `Severity` column | +|-------------------------------------------|----------------|-------------------------------------| +| `NOT_APPLICABLE` | grey | 'N/A' | +| `EXECUTED` | green | 'Applicable' | +| `PASSED` | (not used) | | +| `WARNING` | yellow | 'Warning' | +| `ERROR` | red | 'Error' | + +Display colour is determined by the +[statusToColor](https://github.com/buildingSMART/validate/blob/development/frontend/src/mappings.js#L1) +mapping function. + +Display label is determined by the +[statusToLabel](https://github.com/buildingSMART/validate/blob/development/frontend/src/mappings.js#L10) +mapping function. + +### Overall status + +A single overall status for each type of check (syntax, schema, normative rules, best practices) +is displayed on the Validation Service dashboard for each model. + +The overall status of each +[ValidationTask](https://github.com/buildingSMART/ifc-validation-data-model/blob/main/models.py#L778) +is captured in a different data structure of +[Model.Status](https://github.com/buildingSMART/ifc-validation-data-model/blob/main/models.py#L324) +with the following possible enumeration values: + +| Value of `Model.Status` | Display colour | Symbol | +|-------------------------|----------------|------------------------------------------------------------------------------| +| `VALID` | green | CheckCircleIcon | +| `INVALID` | red | WarningIcon | +| `NOT_VALIDATED` | grey | HourglassBottomIcon | +| `WARNING` | yellow | ErrorIcon | +| `NOT_APPLICABLE` | grey | BrowserNotSupportedIcon (technically possible but doesn't occur in practice) | + +The options for overall status of each category of ValidationTask are as follows: + +- Syntax and Schema + - `VALID` + - `INVALID` + +- Normative Rules + - `VALID` + - `INVALID` + - `NOT_APPLICABLE` + +- Best Practices + - `VALID` + - `WARNING` + - `NOT_APPLICABLE` + +The overall status of a normative rule ValidationTask is determined by +[taking the highest severity](https://github.com/buildingSMART/ifc-validation-data-model/blob/f32164ab762fc695690d380e12e87c815b641912/models.py#L948) +of outcomes for all the rules contained in that task. +