From 51246796e91f1e65d589ae8b3eec81797c68e885 Mon Sep 17 00:00:00 2001 From: M-Chan Date: Tue, 6 Feb 2024 10:36:21 +0000 Subject: [PATCH] deploy: b91597ec3141f40e0d9b4b27d7e29f798330d336 --- main/.buildinfo | 2 +- main/.doctrees/explanations/decisions.doctree | Bin 7633 -> 4949 bytes ...0001-record-architecture-decisions.doctree | Bin 7507 -> 5193 bytes .../decisions/0002-make-skeleton.doctree | Bin 0 -> 6138 bytes .../decisions/0003-docs-structure.doctree | Bin 10901 -> 8748 bytes .../decisions/0004-why-src.doctree | Bin 12502 -> 9875 bytes .../decisions/0005-pyproject-toml.doctree | Bin 6848 -> 4738 bytes .../decisions/0006-setuptools-scm.doctree | Bin 7408 -> 5395 bytes .../decisions/0007-dev-dependencies.doctree | Bin 8307 -> 6467 bytes .../decisions/0008-use-tox.doctree | Bin 17900 -> 15927 bytes .../decisions/0009-sphinx-theme.doctree | Bin 6920 -> 4820 bytes .../decisions/0010-vscode-settings.doctree | Bin 8327 -> 6162 bytes .../decisions/0011-requirements-txt.doctree | Bin 8048 -> 5932 bytes .../decisions/0012-containers.doctree | Bin 8499 -> 6191 bytes .../decisions/0013-switch-to-copier.doctree | Bin 0 -> 6017 bytes .../decisions/0014-split-ci-yaml.doctree | Bin 0 -> 7168 bytes .../tutorials/adopt-existing.doctree | Bin 5131 -> 3019 bytes main/.doctrees/tutorials/create-new.doctree | Bin 10826 -> 8358 bytes main/.doctrees/tutorials/installation.doctree | Bin 11661 -> 9649 bytes main/_sources/explanations/decisions.md.txt | 12 + .../0001-record-architecture-decisions.md.txt | 20 + .../decisions/0002-make-skeleton.md.txt | 21 + .../decisions/0003-docs-structure.md.txt | 37 + .../decisions/0004-why-src.md.txt | 43 ++ .../decisions/0005-pyproject-toml.md.txt | 19 + .../decisions/0006-setuptools-scm.md.txt | 23 + .../decisions/0007-dev-dependencies.md.txt | 32 + .../decisions/0008-use-tox.md.txt | 140 ++++ .../decisions/0009-sphinx-theme.md.txt | 19 + .../decisions/0010-vscode-settings.md.txt | 26 + .../decisions/0011-requirements-txt.md.txt | 27 + .../decisions/0012-containers.md.txt | 29 + .../decisions/0013-switch-to-copier.md.txt | 19 + .../decisions/0014-split-ci-yaml.md.txt | 26 + main/_sources/tutorials/adopt-existing.md.txt | 3 + main/_sources/tutorials/create-new.md.txt | 29 + main/_sources/tutorials/installation.md.txt | 48 ++ main/_static/documentation_options.js | 2 +- main/explanations.html | 13 +- main/explanations/decisions.html | 23 +- .../0001-record-architecture-decisions.html | 22 +- .../decisions/0002-make-skeleton.html | 652 +++++++++++++++++ .../decisions/0003-docs-structure.html | 23 +- main/explanations/decisions/0004-why-src.html | 15 +- .../decisions/0005-pyproject-toml.html | 15 +- .../decisions/0006-setuptools-scm.html | 15 +- .../decisions/0007-dev-dependencies.html | 19 +- main/explanations/decisions/0008-use-tox.html | 18 +- .../decisions/0009-sphinx-theme.html | 15 +- .../decisions/0010-vscode-settings.html | 15 +- .../decisions/0011-requirements-txt.html | 17 +- .../decisions/0012-containers.html | 21 +- .../decisions/0013-switch-to-copier.html | 651 +++++++++++++++++ .../decisions/0014-split-ci-yaml.html | 661 ++++++++++++++++++ main/explanations/structure.html | 19 +- main/explanations/why-use-template.html | 13 +- main/genindex.html | 7 +- main/how-to.html | 14 +- main/how-to/build-docs.html | 10 +- main/how-to/contribute.html | 10 +- main/how-to/dev-install.html | 10 +- main/how-to/excalidraw.html | 10 +- main/how-to/lint.html | 10 +- main/how-to/make-release.html | 10 +- main/how-to/pypi.html | 10 +- main/how-to/run-tests.html | 10 +- main/how-to/static-analysis.html | 10 +- main/how-to/update-template.html | 10 +- main/index.html | 13 +- main/objects.inv | Bin 1139 -> 1226 bytes main/reference.html | 10 +- main/reference/standards.html | 10 +- main/search.html | 7 +- main/searchindex.js | 2 +- main/tutorials.html | 26 +- main/tutorials/adopt-existing.html | 28 +- main/tutorials/create-new.html | 41 +- main/tutorials/installation.html | 36 +- switcher.json | 12 + 79 files changed, 2816 insertions(+), 294 deletions(-) create mode 100644 main/.doctrees/explanations/decisions/0002-make-skeleton.doctree create mode 100644 main/.doctrees/explanations/decisions/0013-switch-to-copier.doctree create mode 100644 main/.doctrees/explanations/decisions/0014-split-ci-yaml.doctree create mode 100644 main/_sources/explanations/decisions.md.txt create mode 100644 main/_sources/explanations/decisions/0001-record-architecture-decisions.md.txt create mode 100644 main/_sources/explanations/decisions/0002-make-skeleton.md.txt create mode 100644 main/_sources/explanations/decisions/0003-docs-structure.md.txt create mode 100644 main/_sources/explanations/decisions/0004-why-src.md.txt create mode 100644 main/_sources/explanations/decisions/0005-pyproject-toml.md.txt create mode 100644 main/_sources/explanations/decisions/0006-setuptools-scm.md.txt create mode 100644 main/_sources/explanations/decisions/0007-dev-dependencies.md.txt create mode 100644 main/_sources/explanations/decisions/0008-use-tox.md.txt create mode 100644 main/_sources/explanations/decisions/0009-sphinx-theme.md.txt create mode 100644 main/_sources/explanations/decisions/0010-vscode-settings.md.txt create mode 100644 main/_sources/explanations/decisions/0011-requirements-txt.md.txt create mode 100644 main/_sources/explanations/decisions/0012-containers.md.txt create mode 100644 main/_sources/explanations/decisions/0013-switch-to-copier.md.txt create mode 100644 main/_sources/explanations/decisions/0014-split-ci-yaml.md.txt create mode 100644 main/_sources/tutorials/adopt-existing.md.txt create mode 100644 main/_sources/tutorials/create-new.md.txt create mode 100644 main/_sources/tutorials/installation.md.txt create mode 100644 main/explanations/decisions/0002-make-skeleton.html create mode 100644 main/explanations/decisions/0013-switch-to-copier.html create mode 100644 main/explanations/decisions/0014-split-ci-yaml.html diff --git a/main/.buildinfo b/main/.buildinfo index 4b5a0214..8d5d0616 100644 --- a/main/.buildinfo +++ b/main/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: b7b03ce0f5c3a708048a495f3e695ebd +config: aaa89cc1f23ce1e26bdd112860687016 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/main/.doctrees/explanations/decisions.doctree b/main/.doctrees/explanations/decisions.doctree index 390cb33d5d037936557bcf20598986a033729416..2e8f8f9caca62185c103c69cbdb044e05df5e186 100644 GIT binary patch delta 1700 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 E0=HoQ1poj5 literal 0 HcmV?d00001 diff --git a/main/.doctrees/explanations/decisions/0003-docs-structure.doctree b/main/.doctrees/explanations/decisions/0003-docs-structure.doctree index dfbd524a12a37a95487946dedb5b4699b91b69ca..074f9adcd211b325e394673f0ebf57d0049415a1 100644 GIT binary patch delta 2400 zcmbtVZD?C%6zl}8pB7T%!&~omIlOcj1Kjy$mgpSH!)1UqsDu@hZAUOT0{uIRXCikOhYti{9dGGt4 z=XuUK?|IL;^6ZV{&L!uSNOaX%gh04^_3hW))v_wjbI#!V(^qf^i=w;EF^@l*H*SEIHC>an!K5!^XXw;Iu8k!#<7Y z=_ZCY<6NjSyuqf>;`t^9w`~D`u!oS-#Gop2@^HR2f+)3#x7|R=b>8*XchKV1CSI>? z0V~cU$ZKLu-rt=uL|wCa!<^tVP*>@$njvHRU(qk?3F3rR*D$QOjv(TClaAj;0Mph# zNL-|C3K14k8+f@WDmghX7DnXUoLUg&%e9Z%PB@V2D~pPUkY~t$w@$_hU6}OS^bGC} z_QC_!g_qG~2yN8&7d$fJ?_2ozA}0hlTcGn_n$By9u?jy^5UbUrQBhIkd`4CBmd6-gk@GF=4vl`}P_$2`e3whxG<$0?q$w1ehjV8UspcjAxg_B>d3v6lTQ$ zL9e%ekJqemkwy#?Uali5buuk2R_0D5xl3>33*BR z;)qh_=hS>QS2eG3%dVAIY20vwzIF6t;*tEo-oObhYNjb_*BA{~bhnpvbvvvEr2U_KtoY^N2;; r=b%3r(OL`nQcf2bn&0=R=NS>i1IZvQ22b%)Rhh09)H&*sno0f*tD@x7 literal 10901 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 GOZyMwb0^6F diff --git a/main/.doctrees/explanations/decisions/0004-why-src.doctree b/main/.doctrees/explanations/decisions/0004-why-src.doctree index 6b95295bfb760922aa848b76a47202a409be8b5d..aa062a67a1fc80f4fee88fdffcc52ef63971164c 100644 GIT binary patch delta 3314 zcmbtWNo*Tc7_PTCb}+G1XQ>;H-LkoRGo^^@Lc&0fdBv5VS(QaBAUFi37Caf8$wWr>e@uelzd;zyJG} z_vZh(00(?;`rf;cuK5UT|EI|7w1_h*K4=e!CBW^ffN}hgTzA^ zI2GCu86}Avu1S)lNSeNfN%st5CM`_ocEtEB41DX}iHI2sp|SXNL{4Mb_@<3Y`P`Jkz_@=$XCfET#b~r}#y^B8 z-36TMN!t*b+~xP%r(C`fl2s4E?}0;G>u=W^;#1@Yhp?>b3O-;n2iah5`vU;2tg&Yj zxiuJdR-J}7g46%QehR(|?#EDd(KOU}BDZ$c$`s(oj)_bjTm6arMn+~OSz?Y?8Lkq{ zYY)fpZMj;~Uov^RhOavI?N5=rj=Tg^zre|?SP<;x@>1eD@z2&Vw#I{%*!yPDHZ1;& z8R*khYQ$PLLJmo`tU7(KsEKp)p4mHXjff06#v>IJrhS^?qpme;EK!jrQ4kLGCssyo zIq+)PIT-4BEXAiCRAWt4T70fdb4;{kc;t*^V0XeFq1TXchl5c&sq3w}!qvwoVO=KN zu3pQZCM+w!m2jaa&s8M3AP93JdrIL%c7d(PQXW2xFk5L+Mu;Wer&$@v(Vxs>@kboq zV>F(4!#jUi-_kJlLOV-ZIs~RHPTSM}{yh@Lk5yTAxQe!N1vjI8SmY+!W#hoY zt>Lw8jk|*`VOMuMGJkDnX58dUc&GchS67L|&s66bnXnHEV?{qU>7kc$t!sMfkvMFv zlYt#Qn=t^(f!;Dk4X)^sIa1zPuy#w}pq{+>Sy0zG!fg8OCqgMZ0 z5IysT=exGd_Zf%P*fcT^iP)y-G)0;RnP{^EjIF0bk}>`mLsD)1IL5or5pR^vNohT| zyY;Pi`;Q>-B`1)MiX$t4aE*Be2N&I5pEB<-C4A>;KyezSljmGA;W`P6$pfzB^7qNC z+x5}%{lTYP`1It^Dfi(KwexgUESIWEMczbLQXL1bUP&oRGAAoCSFOyI*?F$Q(WU)+ z?wQy!Vcag-x{+M`bl!BsUt>L`X66Fv!>@mAwyux?{x=#V&d5qpjaU*ExQc@JR-M0r z+s5fvU8W~onSSnQeimDqui{BjyBv{K3Jd59KlsgB`Cm~$D{B5WZYXLy&ZL^T2kqhB zaB}n{4Jgi6@sAhix=I9ci2%QgzL}&y$LUWQY9rA-6n#MhFOljJxwNFgmNdwcLb~V_ z5+~^fQyQ6a1c<27kjs3T6762jkEUF3evEih{6_e5YzY5Hp_a+QzVS$RQuPX4g{|jY hG~L4gnmOnd;e| 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 diff --git a/main/.doctrees/explanations/decisions/0005-pyproject-toml.doctree b/main/.doctrees/explanations/decisions/0005-pyproject-toml.doctree index 1b0d4e2db7e5056196d1b7de6eed8bb6f2bec9bb..f2a19b38cd3c9457cef960e8eae8affb0e611995 100644 GIT binary patch delta 811 zcmZ{i&ubGw6vsQ+Znv>1v8gsMoa7M%X~lYec!%)pVO}{=r8ow zYmt_|NQ^{=K%7;%Nh(97f`Ax=;2dcD8>yqGK^&%eHsFU78C`1h=al~=kVD^4{vB-| zwepd@$XnVyFndiUs@4P;6{tSi7@D>u8aJSi;PBV+Q#>O#I zJ@c@!fLi6L{O86D`NH2D(>V1=w{Tlc{nL0zzVg{Y>5Lw7ilK#n=+4eQh8FP+_o?=z zsSY2a@%HuMTLBVlyWw}*gGm-%bE}0FmzMn*sXPHe7WHV}^KGB{wp-2>tfF1Er4(HB zwh*|M7GPurj4>%2Laqm5&Qrc~I+{P))`Uw4Ph|z}#Cc5m`s7?R&qn^{m+Uh2El)U4 z(C!71D}QoO^(mZE%*d`uuEA`0)DO1$$*0pnzqYunXJm a^r>;e+1aZRcA`}C{G7K+pUE+4KJ^=NffnHa literal 6848 zcmb_h&2QYs6_-DDrPaqu@>d#LvgsJ9?Z&$+yLI8Zbx}qr$f3VCCrW&uMV*}>+U|sVf(L%f4nmhjEy0GNX9;$k7zE-D+r=2) zB2&g4huLnder;@Q+;0`eYLT(pQ4Ho+H%})$n5+R)ScAw4dDYA-Pq5xYv7E zJV$nD7GRYv%Pp#iChQTJX~G`OJ;_5<(=P=ji{DPqf_CY>$}X*r?9#Unr%c0&jgUnK z7b1)wb~+&o<94=D?I0RZyR~uu?t_j3c#B_>mycJHmY6@NVy66p><4%7aTw?Wg4g8r z>6XQ+Q;aMZ|3h{0<1>(~15^^ZDgPrSqu;}JA5?c;N8?c$>%2B}bplR7y`80>RAmz! zg?4I!qbwqrWA-c|3l<4*R9N!=WIFytnjGfiio?7z;xMm1Wz4W5;o2TEa1w4)koSV; ztO(Z$BT77{C$pSadA@Ezla?tly9sk&@DRK5&X z-r3n{JK2D?Ww(>B4?yscgag4&6{utj7#z7=Xs1@2j*?a4!k2|V=+>n{D1XPGaRBE(vZ5t>fj)6K$y%odhb_wZX?tf!yG!o-jB+B2yh~b7g9J&>2 zl``dcV~FO!hnhj3>YsetZM!z{bwrq61V3`2TYzc_#JscM3x^TI&dF1aRnMgEY9kPnh1pD zrJFNyUXQ`Ob8{vkKBr{UP9myO%v@JjE^0|uo5;DC3E}z!lwqqyUDc21#^O7vtpCFD z5*!-(+?Dkp5xA43UB29vjR8ZwVTmA0(Qs7sTEh^Hg=|5S@;;jLc{7PTw3b9*n^e_M zFBYx=VYHXZbNwI?ejr$-bMus3qVmp9hURWRh=wU7%^1a0Xp-k)Y7CWEG70mTl9)Tl ze5S6guwp(TFScNYh=qu8(__yW%y(MObIU85HMz=mU06+Bt@WUqtU0Wg46s~t$BKMd z4I?6E4Iyd3{5B&}>Aq~bK5S&-ybTq5!ZpQvc9{U^15tVi3rS6Bu~3=uO%lL zhGyY{Fsu@|@V>~mJW{x~BYLUxsv#9Md(O0Jj5yEneq@f!+yax!J;fi=5FWMNjZL*=|dL~||DA6j|tN9xfoYm`RY3)Fs zVg7S^-;r}!Izjxx6ED5vUx3(T5$hY3ahgjzD3e+lJqnFFa9O}Vyi)tI(;tD=RAFG z(8r+927OxiB(g!;#a;-ycy&?w54d%}_Ye3-2TJh)|7@Rsxvy02D|P!y)xJ`*pYZE6 zQDIsHrboc!@DKTW8K92==pXzG{=W>(46UrtEYUB8=CVe!byGoFs(PFXi}Ys*VLYZG8Q>)_hSO#X7TK>VrpL`@ycZ)8 zXmN2&>j$v%RVsTBMKS#F``F@$BEZP}(|9efWkzb1*9v(mTq7yP3O zpPX3n{8kWs<1kTG>r7_$pDCIB`=rda{)rh!@LE49uRDi%WhKvKVvW<&ZCM@TPPApm z5xaU)Vn=M4DxoIxx-lg$<7M%>c2ZtnJG^03ZB3^2Xi8cSUluLnq_j2;(<-a9$>e@H uCAqg>7P;#sIVKm1bgItl1=qK|#G(7afbMwnc!vwJhhqUjvs4oirTeOV2D)fS!$6Dyf z-exEAD)L%~uLypyuZ2uP@IU$ht!M{^J-_ncevuD(V*~u5-UN`|t zFtcu1Hy$ue9hdU#Q|y$f>eN*Vci=7P#Z0H|4If2Ki=AA*##W;-bQKb7smoXkN0A^O zpOL<>t@t$NxYB7p6*-RMO=SYIL4oaPh57IxYzN4}cP_)&3g{~sEE`DumxxR3gSNDA z3DBz>Ut2Fm#PECUx3-u%XW6|JMjk#FnWmP{T%*0tkEyjmv1+kGS-cA~a=FHGdLb&! zH=bpV<@Jdmz2ns?8yBRV{EO3ppWOuu5=WxCbMja08(5eftPT?jdX-^rzDT_Fz0!=s)BjA(<$xY8Au1Bmg kn)BR2a>FJDu^Vo-Ph#&!=Z1p*>aI`9{uX`00cy_v0jP9QA^-pY literal 7408 zcmdT}-EZ8+5tnV9q?4tSWLtJnf6*VQ?b>%IyKP{&O`0G^lR~M|)@k~b5|6hWJQhWP{tW>F1n6s9AVA;SzBFjiqQ6;kN#4mmoRGZKz|q{< z)J<7={MmH_w(IakQNC1*W1 zVA)pMv*e6AUCpZxvEKvZ-p0Lewm0s! z@7~Wfd{!QwD0B)y-5k&szeH-|m!T_u1?O@NzZdblf!{6Yf#2qBev#jS46|AfkmY1< zKGpfJYJ!}5lvqhBv=Dk&ZT;%>Ta)Tv&X+3@=CO6B+-c!8+h$S19KBaXsCL_$em4!Y zsdr6#tkew5EyrbP9n~l`Z7pgo6C36CV@F~1SPkS9Z^bsl}t6SlqOQNfA+~jBFEPa$!(tK2xhGHTjHp2yh3rt^XydiHKWgF}= z_4-PX-`53segu_s5HOA1jQ@dx>F=PKkLq@-qsg-(?s}!hS|D1`H%3-jdYv}G)XCN+ znEDcekwAbTZI%Iilvv^a({%U=G@1OT`EnJ;Ul=iqKfap>9AV(1*MW#RhLt9vkC0?r zo;Mt|{f_YtcLhS26$oP(riN_=i};blxc#Bw_7#=*(N#@;Vj=W-%o1R%168yi69kUO0Fq z1H6BfS;q~+)bo%l<{-v{ndo=b>==+nPOKy^35BTqzw*MfqE^XI%V|_{ZqFQ>nHiC; zOVaf{Ylq#h#LLH>XlOsSI$=EMvY<;zsz~xUTT62CrM1X1S5hiDuW30aG1lTLdv-lZ5^-8kQzYgEsQ_ zfl}p|T(dM=Q=cAJQmq$;IL1Z`b8V6^%J!m|q1vDbROzgusT*}nsKsi!CfX>q67ZZ> zTlH1WREv21kchS0X$fgqb%#{vGfpq|Bc9_aGp>gk!&9kXV^vWN1l5>WP)mbUjcL`d zQ{sQ3cKx83nsi?mF@)cdXOb8f3_Jztuo=bSAZ8*jD;r6eSYEa{BNz1=lp&ilDd9OL zTXq^#(P|dFw&aqgd>HmdTqvdl()hhiXbGCB9I<)yfTbxI@W!ZeA}B-`RE zTe4YX>tUQ>;3!YF{0M`S`GzKT*}-tJ7^bm@(Q*>nCKb6fi;WwQFdk;|R6h)pAWT?o za`Tv6rfMHWfVqbP!OuWx3Dnk+Nydjy1z4WXDY#h`#oR?!XX;WLI~E@lwKvodvk1;^ zdh7{<`i{#*Zh7UfA=lWR3$3Y2OD}53hQoU40Nb^8t(b0etcaQAgVKchZAPH7ec5sY z=*UF+5;|Cw$!41L+xOeT#ruWPNt4BK7@H`89FN7&IEiW}nOw;=UE|VFTrzoaY-Wtb z_Ad~OWh>`f$)LZ!Fgh{zv0Nn#ur!R`8h35~c8Y?UEr$@rXXQ5I!ZBzfG0c`ZAsADN{ILa~bA!usOC@`&Mz zqA260c8kAPd}-)YHl1yIiN0N&u`hb%O`JGSJ&EZhQ;+ zY{h+hj6G2*_FvaA70zmr$?mYYYA>P-0C{lm zxxYcnN`?4(CylTLbpcgtuZRN&u%6I%gFb9P2ZmD=Dn!~FTj%;@yk2PK-bih_oeVaE zzJdc69zq1pkTD*}bsMX8Oy*mzXCm>YK&!-FD_V{)R5cy|AjA}4b3wJaKt{xTIHx3^gm1C2UZBB{o&94yIwWA{2IE<_+<0j){Q{wA= rh4`*l_?SFd23U2WpL7G;OC3re29yLYqVE~f-ze}0NcC48w2%J>M-7}r diff --git a/main/.doctrees/explanations/decisions/0007-dev-dependencies.doctree b/main/.doctrees/explanations/decisions/0007-dev-dependencies.doctree index 08eee71ed465a468235c0d54b94364a36db379cf..15c544dece82fffcae3b69fb44efe4c253a4dd18 100644 GIT binary patch delta 1509 zcmah}OK1~O6zz06`N!H&V@s1^q}Xp7ny#w$M}@i=OuKL=HJ>K+&5%z?W-3)m6?738 zp?F7K3L>}@Y^wzqRaA5#(tTaI7F_5;D71Rt%QQ{DZidS{=iPJez3>sZQ)^m z^GhMi*+rQnK|_OiuHeq5OwvL;BtUrh!_6bclOPGfty-;Klm!|iKFILx+8E+?hNt); zj2VvHHdyB;kngnkDaH@isX_2vjfxV6ehta5u3i#P|wY@`-BmUnHJN2BAn$OL4@yWs3)R)!twxAP?S$r1E?GBEc+3R z$MDfM!41F*e-mukL!P0qN$ito)o+X=G~QWdZ|OMiOYqkIo_mLaZBD~hNKfkp#e`nR zr4F5RlQnebvrMow<>JHD*bnca&;3ojx(|!9EG@Z^g@-;e!`v+ zSRjsGlxvttA6#|?xed$Rshv*3Qx|;(tmSMJUUx`Pd9J30j-!!|qq)pgYw(adhFSMr zR?rx1yT^uiEvXF_8=PA(1h`th|X}JeepGX-1imlw46uWHM4uS_)rHrDrE4>!#oM53BOz)t-IDC18jT zG^yS6Sd>M}ar;h_B4PmkiZhEd!!tF6}NioPtK;a0P4p=S4XayG+uvL6l;5CX zxhT@2u5$2Q^iLhkn;`9zCh43s@ztxZXiaELPZ|xo2C_;{*V08(eT{IX>0Ct!ql(UF zrn7L^^&^yY!?&ldTq28F`13jFRb4>?hox3OA)p%$++ube-ZTXkqIjmt_#p{$jVzM; zWQ%O7WAyYQqdO^Ao0}=isgz$Li4s{Xk*yLVmUMCkos_e9Fv}ojNs&zgECpK>-SAH5 o^I9&irDLd1tsCAcMO*&aZ0BHDiuepycCM(!iW&VnMfGI(AJJp&(*OVf literal 8307 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 diff --git a/main/.doctrees/explanations/decisions/0008-use-tox.doctree b/main/.doctrees/explanations/decisions/0008-use-tox.doctree index e30dbd7e8529cfb3b298e76c19ce9c1c713f058f..d702280933c076558082829762b36dced6eaf546 100644 GIT binary patch delta 4603 zcmbtXYit}>70!%z?S1&McI~y}^^SKP+gZoEYdfjqJRRF|)Fx{iQ<9PpTzhS=_wHmL zu4k6UlsHaNDoh3vbfy6T6{=KKMHNVm%c}y3@Q^@8Jo*EnG!zgJA%SSCN|ho-D)-)* zyED5xP7(Z>y?ehq-#Pc3@1A?+Ust*Bea60Se=a=ys{JfiCB!)7SI$FdQlA_yOMUgc@=v~%B{$T5X8%jHlWk4S%tv5!5-JGjX)AoG_4a zz^J1QYCZKHA6Z?<8M+UBp6gV#qcG|jJ!W$DHJx{xvn5*KLtw8T<6eWeTl%o#c4-cx z`py%OT zaJ9LS>w#}IX1F`xYwGT+Hm_#_DV{Wha+ibO^@aU^)8cSI58@qtv-F&|Vw0`rP%w16 zP*~v8@TZ5SM@`|hSYs|#qJiVuEyQ+EPrT6I=#>@%vDct_WQZW!yWXXgdJ zhbMLAAt82@NrV&?TsM9NU+nDVe!uBy^>Rahz&W|7insBP_$GcxxH5|tDw-%#(HhM7 zp07E#ypo742C;DwYI(y6$N9WY6orwlCb zJe$nNlL=L+T1+g(^J!UCoEI|bL(+150na+H5h=0qsf0=txk2Jj8ZIGrn$`i z2L+uShQl3)%{qI&D0?(HMH;cdPr{SIljcBLtl5Uc6v!_4VX*7}W*LEhbc}q`r1}5J zm)hm{3eHp_9e64wqeDe>B+-uuv9l$W;`2Ce1(`ZK19I*{AhKM@wP~i1-z}Qos42hV zS22tDHS+j6ew1W$mShv&+jWM&&Fa-ci5IM1z25nAuIIn4SD%KLyBGQQC}&8BT`b{j zGaW!wNeh(TPeFF~Va|)6`%M+L3YH^%xJA39(TKJRt#E<4MPneRgM}6i)!3vUnyt&J|S9`6z zVqm#f$?!V$Y6Sk+J7PX{r#{3h3;X~G;R7`$X`W)veO7nwqbBDHjTi%&bEFXy#GB+! z+r$qdIlU#*bA%=5k51qQpEmNe!M_oWaF=m@A~ob=>RH{~8uSk|)_>x$d^VfPCIfTY z37CW0{)gdg-@cJ+C3`Hc?3LPbRvX!0qoRKqe%lvm*4w1d={6ZBIQoxs*I=rDciNrF zNwO=QI-f{u%{lo>vyn+ttX?VcrBnqLc%@Ehc=QShcyEjNO+qHb%6xjWzm>m6lY%b> zhLR|KiHhJP93MDo7QxnsIAwu{!LxUW-(s1+%2J^-!H@Qj;qPfZL;Cl5?a)~~$7xIP zrz-ho=LG*I3?1V6owm*29DJ$bbV#XtDz~z@kjrP~2pLH#aw^SIeqNGOa$Zj5va|Ru zN@Y`IsDfIkeHHtL23Z#AxKQst4zuIU^X0^Gw0lNHJu~$7I&IT#ul&4HZ+MVNW%IcE zR>j9LTrkD$WrpymU?xe-T(Ww58$)@ep=e*(cm|uoU;X8-il?xBD{65G19`={o?}-iYv1!$+J>ApCn<(&qx0QkJhV6 literal 17900 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 ZFd}ECPF@v`0^y|#tA>yb^}|Rn{V#_)d8_~c diff --git a/main/.doctrees/explanations/decisions/0009-sphinx-theme.doctree b/main/.doctrees/explanations/decisions/0009-sphinx-theme.doctree index b783a25d5fc753f10e5fc81d2badf0439be7dd29..34853066d63c65552a5e2679a9fdcb5c7a907449 100644 GIT binary patch delta 769 zcmZ`%&ubGw6z=S1v&1wkY1E==A{J^}n+97!1hq(^ryvzUTMtc0x~Xp$vnlQlQY5H{ zK$h-BX1s|g3Z5kgK|u%vM7&A+Clq=K#G6OoOp}N--ag*<>&;^tSN5i~XWGl}V;{8@ zqNj5NQo%O6OPpxMm;jaiAT{JvNI{0JDxQ(fX#yjEL-IeB0`j`#uc}LkC6C$* z?45cW^^u<5lzJuf1vOErZ-;Iomb}z2Xm?WST&$#$JRj#trnvd%m{x z{nB5PedIE@dEy`D^XM|p`s$^{lE>Fw0w(V+qI^AG}w&yvRY{;BYz+u+GIHAZgzxBO@+r zg%exHql++&hS?2{XR+5%D0ZWzApUoUisewR>~eb@=|LH})bBzxsIvN1nPCb4DWfc( z7+)OnZu=g_4GXdX3Cd_<>K1gN14YO~1M1L%uW$$lG>ACGO4-}l#WRT{wVtvv%?vVS8s6#)1=-9oH+k59tFDK}*>`{R9Hy literal 6920 zcmb_h&5s;M6<>eM?9O^WymoA&*lTxe1=~0?vk53lED{mLLLign!v;>FRnuKF)w@02 z?e1#t?g0r7k#?05mo&E=5#pbS6e$u{f|S1ixPXX2;S?!I{9aX8chA^6?1Ce0d+Jry ztKaX{d#~zMe$o2%zn`1a|Ebk15ka)uW4<57KFCxXyVc~rbps1+J6gD~rr^XD_}$smrZ>7pgtV*Z`trs$}a3}na~U265U zo^xMgaHQa4UeHjCJpF+05`@PGyjvJl?Suh?EX11XxD{w|O0`R@o9c8JM7-F{2TUz8 zDbrw(OK>Dkrvg7C{PSMOvJ67}ZbfWtel7TUQa1+7+fMnA#^h>VvJrI^VpUucOX9LP zCDzr$zKF-XpXO1-)BaAJZugTtDdMQ>#Yw=^uH@q+WRf2y27#>4cQGbnWWKELb1%sB zuZ@k3*Scn-y4py+Gz0G|_fF;mn5qLquu;kq(KPJYyIAdx^YX^aU+-?b)P3nyW7&)9 z@s84>pwl;WHpLY(nz#x}iRZB&*YWoP{%+v!7OWs{i>_D~F9O49YXx9AV;rX5@v~N- z+V>@sd1gV_X1(;cj=nS*{&h24Lzu_Xy=tX}H$9IhlKXb8T2QaHdGysR(T-g;AMnaD za5lq>SsOJZ4Qnl0E0tCw$TO@p|5hAH3IH7q7gg1+8H|q3fb8Wr?6ovuuUGDt0k8ee zN%_M(NO|Tk6OazeoE;v9^e=NVndY9%Q{J=C{@3X>ll|U%`MiYB6@0C`oH=`k% zu^VKN8N0D?w+uzgxfawcesy#fv>)#^_G4{gKi>Xv#>wd-Xg9z1s-|p)ThYGG zaH}N*d4^~st5%6|Qdsl<{n7XnX>zZR8}4;+!oA*j0N1j|r3v{kj<+)>3Ow$x2rh<5 zAH}inMC?&8GDC(O*&A7*3j6<8P0j4nqcgMN|Ey&QW*ya*EFJOsz5>U5xz}^ty8#== z;Pbs;B&2g+UtsR&*g@#*?CkV>GoZ)3UcPN&+n#vpnXFmyF3ZPc=SdAdVj9YwHw4~5aKRkNKgV81ybaL zo)?e%NjB{3-YFt2Bdn2Ef)c9ur@Cz8_=)-~&dW7U@%aR_K0zCXY@5GYV>9huvgbWy zy*M59dDN#HP$o@MYMh~FXi;NqSCSg!bqjKqVvBYCP^`BIYmmjMtf4k&|6uQ}AHLbw z{nLgt!Wv}D3Tlj3EXG4LT6k9ug?E+UjrWqh%2TP)#kFvxjW`ABH1#$NXWKQT3#I=} zsj*0|9*RW!Tat3zV8`R2VXa!G9d8QJV%^=qH7TvpeZ?BAo@JC;e9k1k#?5O9r+uA1 z>us5qmy40Y>01~wV^d-Cirv6YC5q`POBB{TJxJ%NMz+PBeAe+)CJOPQdPb%!$`BE_ z3kC0wXZPJplWMOe{PA%FoxXs?1%ZbAYwc_O|RX%R1Yf~**iK%zgLdK;Gq7llu zHA?lmJ{zWVJBs{5wSU6G97m2l$yGbfWs=KcQ><>P&WNLiVKPn&G;qN{#IkXM#u>Aq zi&eJKTr8V;8ltrqkQb{4&!uOK(d0n zWstb!ZJ3%tJt?}Ie zR?`=DJE)~vJ|E;GEVr`5(g;?=h?KK2BpsOF<3y_1S1UmT8@V{GV;`dm)yd_s`)W4} z@cZ&)r_0kcPF;cHG~_8PPEb9GYSvh~p{1p@6l#5{XG+CZcw%l&tr)#E20Q!mWXIHG zb(T25*D?VU;Rrz?zf375XCn@a`)Hp;J+IEE+>2A+^?3qM!7>5dWK*>fYD3V3MFJnb zio57;A=+w%!mwHp!28mOg`{v*OSE&-_Sd2$x zv#5vTjJwU5+Dkm?K0H>|_05H|#y4Qkm2~J$sV7OT{;M{LQZ+y> zyUo*Hz~xY{fdtSOavb*Iv62lCMW_#odkbnEJ~?))@T>^9SwbFipw4D{kz~8Bz!gYe za|*nu#N_%**_a{F9_EPa42C+d+otJ;vByf&u6qJ+6CO6+#2c)vO^Dgsd4eVA`AEMB zm3iO*-V=L4G=vY>#Bh#MMV1ey#sy0?-s7j#+D9GnYXnx<^dJ{pu^#(qIiJysm@vitte7N-* zNnau9XX0<-OYy~4ha_$KT%^x=`dp`vL!S-$bn(emhqTMR1a$G1qxByMb|Cf-#775O z@qzekUwpZ*Rqktb`&!k$R^89|O=|#24aU2F)C;tkEpf zFOB9oi)QPFhP2%DIBkMuFM!{Y4Ph1|p~Pax8Cy3cW*kBn9y%VxVdcbn=rdEoYIJ8p zW5=$lC!L$nk24~bbSPbz)>Zc4Xhz!e;+&FNq0V@57{WWi0Y@KRYmEGT82#PiM+jj& z(IFY&buoj}ngy%u*A&wu=}NYjArV+{bxhl5wfe2gJglOqzVjVyaY_;382@yxmG#R+ zeR9nSQ0K)Gk33~H@At~0UtHSy6x)-{xV+Hqqly^84V$BF9tW;U~b9Ff`IkIQW9ubA-! zUYC!{>&3@;nKEZKvChe(ZCM-Rjqn$@=V{TpdR$r?kJG9vv)SZ+dPH&$o)$T$Cdbv8DxK={`b-dcVeZrYU_^Jk UMZDt0C~AQ5Bz>jENu$sS&*;*X;I3G!s8D?U0;}Ls5TSzNR(ImLx0BXrbaOfPeCPYl^ZM|uUiq?o+Z9-l z2-bdWaQuHab1p^STiNTSYW8|I9ZLqm-%D5$OIk&?-1n1rR$rqd3XmdZ8 zaZBEEZm#x}tPxUGWpkTs?#~j}$7?Qm1s8^up1Oy>bpmiv;j0m|5))iedYln1ibM2= zVlAtpT06Rg?jg?&v8ECD=ouNbu31;C87o4A+D@voB2Tmu{U4ba z+zqsBuh6mf0@GCz(v}fm@Ho(M=_p#-VSH$ko}hDdR@=foZTuPM&lo<;bmx<~j4^!% zo4^y$IIBpLMLJg$@kJ3^WOOq}g`5ZF`spl93oQylNZb}P>!u0?BVRBwiN)`&4Fo2_ UeSWhxH?129{WLqtbFkF5U)AGg+5i9m literal 8327 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 literal 8048 zcmd^E-H#kc5%<^L$NKKsS2wWA>jpqhcY$-7fR}F!H&|%#t5@>4=9q`!Kuyi|l9FHM5+sv5L~f z?YvyC#-ROG_Q_MwfZ^_U*3o zmJCA~4xNO*m&%0G?kb}>m~!e7-z8q=jC?=K`CNz@xYC(eH_L7%hB#>!3huYesX&H2 z+e-V)w3*h4?57%1lawc=uSlXrFJMZ6i1${=M)}*4pT>2g&%B+44`@tk7Bw4ES0>Jg z=fsM*C{Bt?Chdu6#Cu5^hCJzwqhzNSPqc`_ju*v}Cmqd4alkY`hztQ#kMCkk$Vj28 z=W|ag`*!Qr?c1HEwmN!OcM}EKFK?bm`_S7ml);7xi$zo2XYXUjd(NF(cV6k-y4|^b zH&^oo^JGV%RfyEfMcNXVNpa$NXiHqd;k=07OZZ*I?>aOgZitS!ByNI-Q>7-r%jq0O zH4e^}1heptW;!j-`a;#LxBl+owtmh}s-0-yupq#kn1?xtx=L59wjBt z*GjZZ;e6365LpAgL7Ibf0^1yL{3xHIH%+rZ}(*t_tu7Ej7a6~Qi+u`@_G|0!S<`t3OF2T}vo!0%k%rg z%R_$XlYF?1QJg8;`t>7wLE$C~xKa*XZ-T?7U@apAfkW~*)s?2Y&chJ)Ma29%%Wu7= zCAG&A7b?&q-b);Hy)3> zem%^;6QKD;B8)|%O^7@Zn>)HMpE?YUVp~#X@^LV-B@qiUe z_Fg`az2}L&(IlQ!NTo&x`Q*?lafYc=)Z0*8*{)eSU*KbQ3Yg{BN2xDt^UmwdXz1WNvoK4-}$r}r9 z6gT%&j^2>LRz03}yJO7ECMO%$1v2}C)9B-C-U=A{YMP~56wvQkp=%86M*Y^QPQpj5P8)qVyEf4)@<5e4r-Z}k7RfV3D(9ep->JZ z63#}TEJOVsC!w-EvnE66$VIpjQ97HMuD{0IVqi72!@nk#LoKOv;8F z8u!sYfm)$?CgC1}ezzH*Ko1MBy#d68Mx+m{@`2pV#DZC4sgB&5WKKxHYt>Ijv0Fh9 zinRn}7d#1Bps>stOR?alL5(#9(OerLb!SMLlENdDBJs z%L>(ALMaIR;NWw6gO;rdF?%PCu?3Z;ZN0hh1N%TvlBikjD>LB?u>szKo*m9jx! zBx3%4ZTk%v`SwFR1QS0Id*XfZvG{2FK2cvI>gVFK?L}&xqQ?e3*6DGD9+&CSrN<3= ze2X4;@kq@w?V%?zghpN1?y@h~zS!FrAMe}c_r>RXcI7?0>YiP3&#ty-SK3R(6`E_A zTLE*gf;nG&BtFPF`$T*u{$|+{|IT?jP5WD(o~1X-(@P~!+jlHut4;J-b*y?47$$u} zMLC6>OgS#sdy|rn!*>9nb<~f73ea}w#tg9~w8O)`CqSyK}Q zr%;lsE4wVz*VXg<1CF?0?mfUkCu9vyj#cM{BDtALUS2>(>fl~Rv8Qlc$RhJJO+2^# zDUL_Y31lb|>0sQS=osgWGp*t>K5kAC0O3I%ZvEg*x)Jk_RpN`{d(Y-othxOMyWaL6 z@u$p$3c;$+1eKsSo)pw3Kl3H~=OHEg$5AEQ{ySzoMXqZ{mFwn{a^*SDe8DzO9PY^0 zG44o5c93A#k1E(x4$S6M^X2LuQmz|cmRv6%Rj!wxJTOYX=8N^jgn-9?*?$t$awH27$uee E0PkX&7XSbN diff --git a/main/.doctrees/explanations/decisions/0012-containers.doctree b/main/.doctrees/explanations/decisions/0012-containers.doctree index 530e4b13036118619ba39f6b5447f7cb86f57a54..2d0f209d2a01c56e10395d72c0816030b5f5fb78 100644 GIT binary patch delta 1255 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 b$G60!f diff --git a/main/.doctrees/explanations/decisions/0013-switch-to-copier.doctree b/main/.doctrees/explanations/decisions/0013-switch-to-copier.doctree new file mode 100644 index 0000000000000000000000000000000000000000..5285945a91c6de56b573bea3fcd2ac3b09b00d54 GIT binary patch literal 6017 zcmeHLOK%*<5vD{f$>p1R&;j(w7=dF7;qH=>4~75(38I@49wNmtU?_v$ncnRtXQs!~ zJ$xJ#I|l3SdA$enF1;4><-fU?9IBKf!?WRnN@M?1~H+Uz|e(tu$TzsP5{o zzN+faI)6HTYtH?#8#)y-IqkDBOjO8qVV6P`7pYR#Nx|hM|5q+NE7i^m%Y9JxbHnbktPtH zQC^@@$+LpSWB831{FL@_$*9kZa(@dc!){C=wrtm*Y+uaVg=*Ia_C_QVUL52@W|x^U znH=T@r=`=)%TUuv7K4as4I#ce35(0Gr7%yM#*hU^86VM@+%6h6rmjM4hzHNEiTlgAUweD|k9*o# zs%KQSVm}TGaaXL0dtyEx!em|8f{inlinf(EpF-&q@6q0)_j-H#z5Vw~3vb&uJ1V1M z(E%+g?jMK;WH<3c7)!j3d-)N5@8I_?eh*;?@e|R50WehTw)V18qNln3&01g=o*QOz zU2mdpHmZMmb=741PNn*T$_)L9rlp?+0Z$Ewl?YPXwh=Vi4z8|^4!St4jZZ8Cyp`u- zwT)VmmbI2!Tdr^JKUiz==PEJe2-OiL?dAmItDk`E)vZnt&f4pv;@aHY3&FiK|Xq*u|ZVici}rE@uY20M&UW3;X1|!^H8+D}Z*T0Ia9xVceW?cUP$7}6jO8(yiF|spd+ZWP^FaN5@@kMO;I1t zA+;fYsq>2(((p6o#p>9(kfBgt!fWCJHA{S7>KjY`>*|)IWb)RuC0oc?1+zBy*Pvro zK7)|@YAS@Z7TlaI9*SmBSB91SWa^3!SUV0-)`}v><@odEyqC)vujijCwc6j0^xB1$vSd6nfgeT zsm#_`@@^?XPVFQN>nAKrU^R@OEEtk5<{PW4VE15?o^!vO2q7uG{RPo_%k+V`j45q%#0( zTEIjR&Q#bn6w~9JjX5kHqJ13?7xq@h1C@n-$WtH%Y9wHCK#?yQ;h3<941rZXlBb1O zu2?SwSCqR|LvxG&o;D(bpaMSfSqEz!dRQ_p9klI96pfvZ} zGaX6-;~%5^FCn_&hf=d)LLzw&@E>G|!wb z@`P3kapfy`;lWjvO+a*u{0qoQ#sFd@V`++CZoX^RQ=a;ha)J)CN|GVN-pM)a59;U- zvF?{8Mqg#)L1FLENVfru^y}0GuSt;i-r0K(_FT_K!OZd`X_o(Sy*!+i5oC{e)|cFj zoDLAcK$tj!vaVr6coEXJ;@OhD4@}1X#62em@O4TEIk%ho3^m%RFHo{ZRJIm)Fj55l zRUI=p+9x^uTEkGcT)S-gkqTI4+WW}ZupeA}>2I*IGa+UlV^ptf}05kEBhj8IDY(a2tpyW<~QAa+HnT&iq=@HSo zZEsbNasX>IDrxQ9&hzA$p2X}@Nhk1MKv5>4gmW0*Fx1?jCje&)n*y{9_!Sf$(gPU1 zoNXZ24N+q!rbk~$GP?Gy*`cl;pL!0o^ZWaIb-;GtW%Lwx4^#NQzTmCtO;zpCbeLco zMJAkOtJza56Zgn>sL(yhb+7H$s_`{Z{MluSFIevq)w#Vnb@uYr@IpHs#!z?RRzF2Y zP8Tw&r@JDWo+w}8iIRln_s-!Wh92I)KZ1$hiZ8{V#aH4V;#=`eZo4$joTa#X=yxN} z1v?jCo{O)}#kc3Vc$?&I@+u~OfXN{yzZTz!uXDTBb`__1Es$_Hx_s=cln^7<<4TaU zCFM9k2d)(lRW$KFH}v+5a5B0(wPLr{>L%TsS|7nJGZanl%&t}SAg2IdJ9JWDS_xDX z0oFJJVm6-8fLh4EfPp?Qeg*EqyD3 cSI8=$2x$ghQ0;PjrV)*!9BIm{0*_?>26ms<-2eap literal 0 HcmV?d00001 diff --git a/main/.doctrees/explanations/decisions/0014-split-ci-yaml.doctree b/main/.doctrees/explanations/decisions/0014-split-ci-yaml.doctree new file mode 100644 index 0000000000000000000000000000000000000000..24f44d86f265c937cfadc231743f30dc565a3ccd GIT binary patch literal 7168 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 X4*91IJss?!2`>E<70j~?O_%=xbof0d literal 0 HcmV?d00001 diff --git a/main/.doctrees/tutorials/adopt-existing.doctree b/main/.doctrees/tutorials/adopt-existing.doctree index f1f36fa537588aba2420ab40dce1ad8aa091a1d5..29d206775da41143b62d916027f4c36674bcfeb0 100644 GIT binary patch delta 488 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 {material-regular}`format_quote;2em` +> +> The Grand Unified Theory of Documentation +> +>

-David Laing

+ +There is a secret that needs to be understood in order to write good software +documentation: there isn't one thing called *documentation*, there are four. + +They are: *tutorials*, *how-to guides*, *technical reference* and *explanation*. +They represent four different purposes or functions, and require four different +approaches to their creation. Understanding the implications of this will help +improve most documentation - often immensely. + +[More information on this topic.](https://documentation.divio.com) + +## Consequences + +See article linked above. diff --git a/main/_sources/explanations/decisions/0004-why-src.md.txt b/main/_sources/explanations/decisions/0004-why-src.md.txt new file mode 100644 index 00000000..e4485930 --- /dev/null +++ b/main/_sources/explanations/decisions/0004-why-src.md.txt @@ -0,0 +1,43 @@ +(src)= + +# 4. Use a source directory + +Date: 2023-01-18 + +## Status + +Accepted + +## Context + +We need to decide how to structure the source code in skeleton based projects. + +## Decision + +As per [Hynek's article] and summarized below. + +The main advantage is that the source directory cannot shadow installed packages +as it would if it was in the root of the repository. This means that if you +install the package, then run the tests, they will run against the installed +package and not the source directory, testing for packaging bugs. + +A secondary advantage is symmetry, sources go in `src/`, tests go in +`tests\`, docs go in `docs`. + +This is tested in CI in the following way: + +- `wheel` job creates a wheel, then installs it in an isolated environment and + runs the cli. This checks `install_requirements` are sufficient to run the + cli. +- `test` job with `lock: true` does an [editable install] of the + package. This is the mode that is used at development time, as modifications + to sources can be tested without reinstalling. +- `test` job with `lock: false` does a regular install, which + checks that all files needed for the tests are packaged with the distribution. + +## Consequences + +See the article linked above. + +[editable install]: https://pip.pypa.io/en/stable/cli/pip_install/#editable-installs +[hynek's article]: https://hynek.me/articles/testing-packaging/ diff --git a/main/_sources/explanations/decisions/0005-pyproject-toml.md.txt b/main/_sources/explanations/decisions/0005-pyproject-toml.md.txt new file mode 100644 index 00000000..bad000da --- /dev/null +++ b/main/_sources/explanations/decisions/0005-pyproject-toml.md.txt @@ -0,0 +1,19 @@ +# 5. Use pyproject.toml + +Date: 2023-01-18 + +## Status + +Accepted + +## Context + +Need a decision on where to put the python project configuration. + +## Decision + +Use pyproject.toml as per + +## Consequences + +See article linked above. diff --git a/main/_sources/explanations/decisions/0006-setuptools-scm.md.txt b/main/_sources/explanations/decisions/0006-setuptools-scm.md.txt new file mode 100644 index 00000000..ac934e5c --- /dev/null +++ b/main/_sources/explanations/decisions/0006-setuptools-scm.md.txt @@ -0,0 +1,23 @@ +# 6. Use setuptools_scm + +Date: 2023-01-18 + +## Status + +Accepted + +## Context + +We require a mechanism for generating version numbers in python. + +## Decision + +Generate the version number from git tags using setuptools scm. + +See + +## Consequences + +Versions are generated automatically from git tags. This means you can +can verify if you are running a released version of the code as +setup tools scm adds a suffix to untagged commits. diff --git a/main/_sources/explanations/decisions/0007-dev-dependencies.md.txt b/main/_sources/explanations/decisions/0007-dev-dependencies.md.txt new file mode 100644 index 00000000..2a8cff4e --- /dev/null +++ b/main/_sources/explanations/decisions/0007-dev-dependencies.md.txt @@ -0,0 +1,32 @@ +# 7. Installing developer environment + +Date: 2023-01-18 + +## Status + +Accepted + +## Context + +We need to provide a way to setup a developer environment for a skeleton based +project. + +## Decision + +Use optional dependencies in pyproject.toml. + +PEP 621 provides a mechanism for adding optional dependencies in pyproject.toml +. + +We supply a list of developer dependencies under the title "dev". These +developer dependencies enable building and testing the project and +its documentation. + +## Consequences + +Any developer can update their virtual environment in order to work on +a skeleton based project with the command: + +`` `bash +pip install -e .[dev] +` `` diff --git a/main/_sources/explanations/decisions/0008-use-tox.md.txt b/main/_sources/explanations/decisions/0008-use-tox.md.txt new file mode 100644 index 00000000..3172aa1f --- /dev/null +++ b/main/_sources/explanations/decisions/0008-use-tox.md.txt @@ -0,0 +1,140 @@ +# 8. Use tox and pre-commit + +Date: 2023-01-18 + +## Status + +Accepted + +## Context + +We require an easy way to locally run the same checks as CI. This provides a +rapid inner-loop developer experience. + +## Decision + +Use tox and pre-commit. + +tox is an automation tool that we use to run all checks in parallel, +see . + +pre-commit provides a hook into git commit which runs some of the checks +against the changes you are about to commit. + +## Decision detail + +There are a number of things that CI needs to run: + +- pytest +- black +- mypy +- flake8 +- isort +- build documentation + +The initial approach this module took was to integrate everything +under pytest that had a plugin, and isort under flake8: + +```{eval-rst} +.. digraph:: initial + + bgcolor=transparent + graph [fontname="Lato" fontsize=10 style=filled fillcolor="#8BC4E9"] + node [fontname="Lato" fontsize=10 shape=box style=filled fillcolor="#8BC4E9"] + + subgraph cluster_0 { + label = "pytest" + "pytest-black" + "pytest-mypy" + subgraph cluster_1 { + label = "pytest-flake8" + "flake8-isort" + } + } +``` + +This had the advantage that a `pytest tests` run in CI would catch and +report all test failures, but made each run take longer than it needed to. Also, +flake8 states that it [does not have a public, stable, Python API](https://flake8.pycqa.org/en/latest/user/python-api.html) so did not +recommend the approach taken by pytest-flake8. + +To address this, the tree was rearranged: + +```{eval-rst} +.. digraph:: rearranged + + bgcolor=transparent + graph [fontname="Lato" fontsize=10 style=filled fillcolor="#8BC4E9"] + node [fontname="Lato" fontsize=10 shape=box style=filled fillcolor="#8BC4E9"] + + pytest + black + mypy + subgraph cluster_1 { + label = "flake8" + "flake8-isort" + } +``` + +If using VSCode, this will still run black, flake8 and mypy on file save, but +for those using other editors and for CI another solution was needed. Enter +[pre-commit](https://pre-commit.com/). This allows hooks to be run at `git +commit` time on just the files that have changed, as well as on all tracked +files by CI. All that is needed is a one time install of the git commit hook: + +``` +$ pre-commit install +``` + +Finally tox was added to run all of the CI checks including +the documentation build. mypy was moved out of the pre-commit and into tox +because it was quite long running and +therefore intrusive. tox can be invoked to run all the checks in +parallel with: + +``` +$ tox -p +``` + +The graph now looks like: + +```{eval-rst} +.. digraph:: rearranged + + bgcolor=transparent + graph [fontname="Lato" fontsize=10 style=filled fillcolor="#8BC4E9"] + node [fontname="Lato" fontsize=10 shape=box style=filled fillcolor="#8BC4E9"] + + subgraph cluster_0 + { + label = "tox -p" + pytest + mypy + "sphinx-build" + subgraph cluster_1 { + label = "pre-commit" + black + subgraph cluster_2 { + label = "flake8" + "flake8-isort" + } + } + } +``` + +Now the workflow looks like this: + +- Save file, VSCode runs black, flake8 and mypy on it +- Run 'tox -p' and fix issues until it succeeds +- Commit files and pre-commit runs black and flake8 on them (if the + developer had not run tox then this catches some of the most common issues) +- Push to remote and CI runs black, flake8, mypy once on all files + (using tox), then pytest multiple times in a test matrix + +## Consequences + +Running `tox -p` before pushing to GitHub verifies that the CI will *most +likely* succeed. + +Committing changes to git will run all of the non-time critical checks and +help avoid some of the most common mistakes. diff --git a/main/_sources/explanations/decisions/0009-sphinx-theme.md.txt b/main/_sources/explanations/decisions/0009-sphinx-theme.md.txt new file mode 100644 index 00000000..54aea6d8 --- /dev/null +++ b/main/_sources/explanations/decisions/0009-sphinx-theme.md.txt @@ -0,0 +1,19 @@ +# 9. Sphinx theme + +Date: 2023-01-18 + +## Status + +Accepted + +## Context + +Documentation requires a theme as well as a structure. + +## Decision + +Use the pydata theme defined here + +## Consequences + +The documentation looks nice and has good navigation features. diff --git a/main/_sources/explanations/decisions/0010-vscode-settings.md.txt b/main/_sources/explanations/decisions/0010-vscode-settings.md.txt new file mode 100644 index 00000000..c21124ac --- /dev/null +++ b/main/_sources/explanations/decisions/0010-vscode-settings.md.txt @@ -0,0 +1,26 @@ +# 10. Include vscode settings + +Date: 2023-01-18 + +## Status + +Accepted + +## Context + +For vscode users a couple of settings are required for neat integration with +the IDE. + +## Decision + +Include a .vscode folder in the repo with some json files that enable: + +- recommended extension for best experience +- launcher to make debugging of python code override the coverage settings +- settings to make code verification match the tools in CI +- a task to launch the tox tests from the IDE + +## Consequences + +Users of vscode should find that their development environment just works. +Users of other editors will be unaffected. diff --git a/main/_sources/explanations/decisions/0011-requirements-txt.md.txt b/main/_sources/explanations/decisions/0011-requirements-txt.md.txt new file mode 100644 index 00000000..318c8301 --- /dev/null +++ b/main/_sources/explanations/decisions/0011-requirements-txt.md.txt @@ -0,0 +1,27 @@ +# 11. Pinning requirements + +Date: 2023-01-18 + +## Status + +Accepted + +## Context + +Require the ability to pin requirements for a guaranteed rebuild. +By default CI builds against the latest version of all dependencies, but we +need a mechanism for overriding this behaviour with a lock file +when there are issues. + +## Decision + +Have every release generate requirements.txt files using pip freeze and +publish them as release assets. + +Request that the user download the asset and commit it into the repo in order +to lock dependencies for the next CI build. + +## Consequences + +There is less overhead in managing lock files. Incoming issues with dependencies +will be highlighted early but can be worked around quickly if needed. diff --git a/main/_sources/explanations/decisions/0012-containers.md.txt b/main/_sources/explanations/decisions/0012-containers.md.txt new file mode 100644 index 00000000..9facedd8 --- /dev/null +++ b/main/_sources/explanations/decisions/0012-containers.md.txt @@ -0,0 +1,29 @@ +# 12. Use containers + +Date: 2023-01-18 + +## Status + +Accepted + +## Context + +Allow developers and users to take advantage of containers. + +## Decision + +Provide a single Dockerfile that can build two kinds of container: + +- a minimal runtime container that can be used to execute the application in + isolation without setting up a virtual environment or installing system + dependencies +- a devcontainer for working on the project with the same isolation as above + +CI builds the runtime container and publishes it to ghcr.io. + +A .devcontainer folder provides the means to build and launch the developer +container using vscode. + +## Consequences + +We can label projects as cloud native. diff --git a/main/_sources/explanations/decisions/0013-switch-to-copier.md.txt b/main/_sources/explanations/decisions/0013-switch-to-copier.md.txt new file mode 100644 index 00000000..55a68636 --- /dev/null +++ b/main/_sources/explanations/decisions/0013-switch-to-copier.md.txt @@ -0,0 +1,19 @@ +# 13. Switch to copier + +Date: 2024-01-18 + +## Status + +Accepted + +## Context + +The previous attempt, [python3-pip-skeleton](https://github.com/DiamondLightSource/python3-pip-skeleton) was a repo that can be forked and updates merged into projects tracking it. This was initially encouraging, but led to downstream confusion on who had actually contributed to the repository, as well as messy merges when text that contained the project name (like documentation) was changed upstream. + +## Decision + +Use [copier](https://copier.readthedocs.io/) which gives the best of both worlds, a templating engine to expand the template, then an update mechanism to apply diffs of the updated template to the project. + +## Consequences + +We will need to create and document an adoption process for existing skeleton projects to move to this copier template diff --git a/main/_sources/explanations/decisions/0014-split-ci-yaml.md.txt b/main/_sources/explanations/decisions/0014-split-ci-yaml.md.txt new file mode 100644 index 00000000..b0843f1e --- /dev/null +++ b/main/_sources/explanations/decisions/0014-split-ci-yaml.md.txt @@ -0,0 +1,26 @@ +# 14. Split up CI YAML + +Date: 2024-01-31 + +## Status + +Accepted + +## Context + +The existing monolithic CI had some problems: + +- We want some parts to be optional, which required templated CI which then couldn't be easily tested +- We wanted to reuse some parts of the CI in the template repo +- It was long and hard to read +- It was split into multiple top level jobs + +## Decision + +Break it into multiple [reusable workflows](https://docs.github.com/en/actions/using-workflows/reusing-workflows) that are called from: +- A single `ci` workflow that runs on push, and tests, builds, and adds artifacts to releases +- A single `periodic` workflow that runs once a week and checks links aren't broken + +## Consequences + +We can reuse workflows in the template repo diff --git a/main/_sources/tutorials/adopt-existing.md.txt b/main/_sources/tutorials/adopt-existing.md.txt new file mode 100644 index 00000000..f1712368 --- /dev/null +++ b/main/_sources/tutorials/adopt-existing.md.txt @@ -0,0 +1,3 @@ +# Adopt the template into an existing repo + +TODO diff --git a/main/_sources/tutorials/create-new.md.txt b/main/_sources/tutorials/create-new.md.txt new file mode 100644 index 00000000..2aafd06c --- /dev/null +++ b/main/_sources/tutorials/create-new.md.txt @@ -0,0 +1,29 @@ +# Create a new repo from the template + +Once you have followed the [](./installation) tutorial, you can use `copier` to make a new project from the template: + +``` +$ mkdir /path/to/my-project +$ copier copy gh:DiamondLightSource/python-copier-template /path/to/my-project +``` + +This will: + +- Ask some questions about the project to be created +- Expand the template with the answers give +- Record the answers in the project so they can be used in later updates + +## Uploading to GitHub + +You can now [create a new blank project on GitHub](https://github.com/new). Choose the same GitHub owner and repo name that you answered in the questions earlier. GitHub will now give you the commands needed to upload your repo from GitHub + +## Setings + +You can now go to the `Settings` and set: + +- The project description to match the answer you gave +- Enable Pages if you chose to use sphinx for your documentation + +## Getting started with your new repo + +You can now [](../how-to/dev-install), and then follow some of the other [](../how-to). diff --git a/main/_sources/tutorials/installation.md.txt b/main/_sources/tutorials/installation.md.txt new file mode 100644 index 00000000..e1bfa5ab --- /dev/null +++ b/main/_sources/tutorials/installation.md.txt @@ -0,0 +1,48 @@ +# Install template pre-requisites + +This tutorial will take you through installing copier, the templating engine that will allow you +to create new projects from the template, update existing projects in line with it, and keep projects in sync with changes to it. + +## Check your version of python + +You will need python 3.8 or later. You can check your version of python by +typing into a terminal: + +``` +$ python3 --version +``` + +:::{note} +At Diamond you can use `module load python` to get a more recent version of python on your path +::: + +## Create a virtual environment + +It is recommended that you install into a “virtual environment” so this +installation will not interfere with any existing Python software: + +``` +$ python3 -m venv /path/to/venv +$ source /path/to/venv/bin/activate +``` + +:::{note} +You may wish to deactivate any existing virual environments before sourcing the new +environment. Deactivation can be performed by executing: + +- `conda deactivate` for conda +- `deactivate` for venv or virtualenv +- `exit` for pipenv +::: + +## Installing copier + +You can now use `pip` to install copier so you can make your project from the template: + +``` +$ python3 -m pip install copier +``` + +## Conclusion + +You now have the pre-requisites to allow you to [](./create-new) and [](./adopt-existing). diff --git a/main/_static/documentation_options.js b/main/_static/documentation_options.js index 4b2d662a..05992db4 100644 --- a/main/_static/documentation_options.js +++ b/main/_static/documentation_options.js @@ -1,5 +1,5 @@ const DOCUMENTATION_OPTIONS = { - VERSION: '7fa46bc', + VERSION: '1.0.2-7-gb91597e', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/main/explanations.html b/main/explanations.html index 021b2b8b..ddd96679 100644 --- a/main/explanations.html +++ b/main/explanations.html @@ -8,7 +8,7 @@ - Explanations — python-copier-template 7fa46bc + <title>Explanations — python-copier-template 1.0.2-7-gb91597e documentation @@ -39,7 +39,7 @@ - + @@ -49,8 +49,7 @@ @@ -439,6 +438,7 @@
@@ -541,7 +540,7 @@

Installing copier

Conclusion#

-

You now have the pre-requisites to allow you to Creating a new repo from the template and Adopting the template into an existing repo.

+

You now have the pre-requisites to allow you to Create a new repo from the template and Adopt the template into an existing repo.

@@ -569,7 +568,7 @@

Conclusion

next

-

Creating a new repo from the template

+

Create a new repo from the template

@@ -602,8 +601,7 @@

Conclusion - + @@ -618,7 +616,7 @@

Conclusion diff --git a/switcher.json b/switcher.json index 687379e8..955698ee 100644 --- a/switcher.json +++ b/switcher.json @@ -1,6 +1,18 @@ [ + { + "version": "main", + "url": "https://DiamondLightSource.github.io/python-copier-template/main/" + }, { "version": "1.0.2", "url": "https://DiamondLightSource.github.io/python-copier-template/1.0.2/" + }, + { + "version": "1.0.1", + "url": "https://DiamondLightSource.github.io/python-copier-template/1.0.1/" + }, + { + "version": "1.0.0", + "url": "https://DiamondLightSource.github.io/python-copier-template/1.0.0/" } ] \ No newline at end of file