From 9b4a4384b40ca041c11e399b880a67b64f5aa75d Mon Sep 17 00:00:00 2001 From: Teresia Olsson Date: Wed, 9 Sep 2026 16:39:18 +0200 Subject: [PATCH 1/5] Add copier to dev dependencies. --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 39cb6a6..f739ab0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,6 +54,7 @@ dev = [ "mypy", # Typage statique (optionnel) "ipython", # Dรฉbogage interactif "pre-commit", + "copier", ] [project.urls] From a28838883ecf653f91395474814c80000b534b91 Mon Sep 17 00:00:00 2001 From: Teresia Olsson Date: Wed, 9 Sep 2026 16:45:28 +0200 Subject: [PATCH 2/5] Add docs. --- .readthedocs.yaml | 25 +++++++ docs/Makefile | 20 ++++++ docs/make.bat | 35 ++++++++++ docs/requirements.txt | 4 ++ docs/source/_static/_images/dark.png | Bin 0 -> 20491 bytes docs/source/_static/_images/logo.png | Bin 0 -> 20405 bytes docs/source/_static/_images/logosmall.png | Bin 0 -> 16262 bytes docs/source/_static/custom.css | 7 ++ docs/source/_templates/.gitkeep | 0 docs/source/api.rst | 14 ++++ docs/source/conf.py | 77 ++++++++++++++++++++++ docs/source/index.rst | 16 +++++ 12 files changed, 198 insertions(+) create mode 100644 .readthedocs.yaml create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/requirements.txt create mode 100644 docs/source/_static/_images/dark.png create mode 100644 docs/source/_static/_images/logo.png create mode 100644 docs/source/_static/_images/logosmall.png create mode 100644 docs/source/_static/custom.css create mode 100644 docs/source/_templates/.gitkeep create mode 100644 docs/source/api.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/index.rst diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..4e993c1 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,25 @@ +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version, and other tools you might need +build: + os: ubuntu-24.04 + tools: + python: "3.13" + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/source/conf.py + +# Optionally, but recommended, +# declare the Python requirements required to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: docs/requirements.txt + - method: pip + path: . + extra_requirements: [] diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /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 = source +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/make.bat b/docs/make.bat new file mode 100644 index 0000000..747ffb7 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..0c89451 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,4 @@ +sphinx~= 8.1 +pydata-sphinx-theme +myst_parser +sphinx-copybutton diff --git a/docs/source/_static/_images/dark.png b/docs/source/_static/_images/dark.png new file mode 100644 index 0000000000000000000000000000000000000000..15e19c263707145a9b9b021129048361fb657ee4 GIT binary patch literal 20491 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 Os&~r}ZBTy0G4g-zoh~u} literal 0 HcmV?d00001 diff --git a/docs/source/_static/_images/logo.png b/docs/source/_static/_images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ddba8ad8155f35392eb84a63e60aa36745eb8c16 GIT binary patch literal 20405 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%0D1=FR{q{2jKLIA9m^ja;hP zfdHHQCu8!8d=tq(#R4!pj!!rpF~xT;-VIxz@n0@zx%o?$BGi-a*u2@0acg1d-N51m~i-^XJbW9>K_Uff&t>(P`x8z(dZg|<+4p8QnI1K!~~ z@u5jpj#raQ0{#y-ZN`+!Ev~=4^Kc<8)Li{s zM--LG(^UWpijWjWWKu(<;h;Y0^bnt+Zh81cgKWN<0typOQzoBbyL)>-#LoZgnYu+z zgX1couec;ayp(d~u}Wjb$xy)e#_4#aE}gliElRh*beSeL|1{|4*QO?LBv01VeJAAC z>L_1gwMbe}CaO;Iz=8N|RsRTFH2H7#fAjRJY0V^GCiDAx#`pC)MqbABQ7VRq zg;|pTKU8NnEaK$+=+lfe3$NJ~EfxQUsujCDMec%=3_f=tknZXfJ`HgRiE7K1Xo<*` z4In$m0O;WhjU-?m2u22J3DkNT^qw5GxF6V$!b_FsLN>cr?XEZtxo8}qRc#;qD`YPf z*kmSe|2q@ANS%@p_{3Nf6@=hSylnK%@&=I%1v(VH!Sp~=u5>gUu6B9b|p(u*$WBNON*yjWCJj<@P zo+%NUQ(Y@O9%$r=?kW7g54qFSBZHDTCFUiMZ^c|`3o z+y4B0my1ClGNzs@89nC*+j<<5K0BdYxul$VWHUL?i_5o9+87V>!8+(>(~Tv8Q2P@* zGX9O&nK(r^zBX1?2_JWV;Z@>wSl#-HAMt59#Ws@-)b# zmMpG#*;!Cwe`Bqb#|{Phf58L^F?QtH=hnivsXOOwzg-jIP28Z5v9OHe zS}Dgo*uIWUl!g-|p=rG(b-ty)?TRyx zgPNWz+qebfE^+XAaD@qJc#weSSgU4NB`@i>lK7&JF)iRHA09k%&0nw1mazm;owyUy z_sZq;Pp7XOr}7lh2PJUq(L-y!_TEU4=kV(1uH57Kph-usCpt|2G;6T?){4C`=W{C>Dq7c@jXjZs?)k5Wm z|KxaBBh-Gnj1JbILiK_=?*1gf*}XC~>wl>FMQ3J;{{j*0Zn~K8>7hNly?Rk;;CK`D#TsbZf}W)!i1h zTlnXJ1x9^3W(34|tA_x6ZOKkr)Kdvj zIhwDiuUT==1j-IxsM~%(PSMG015gOJHIu?Lzs0(jF6gbSIKQp(;4qLtO?fkP!`;02 z0`jX$$?^JV*#STC7{LQJHHy;CCH^G$b`9XuX)ov1OGCcWi#}3L!Xw$;jCt%4EoCHR z-3BZmX$jVkasSe+{Zc&*WHDSh-* zpz;)NTWc0t|G`UG@+(_{%b(+ec6!9OD!Zp;N?)>GpZa3i3P5WA`gZ_KK%UUwniWJ+ zqoe65v>YtP9$t+|G zQ~ug42{B#NbAJQrEb3EW37`Y7u!zp7E(dPaF5I(Uu1S=UD{ZQ2>tY?7;reDDpuL0n zvx`HFk5VU^x2W(mUuB=f4_ma5`%bb(qyNAdhy#V!Q6cPfi_?bU&KyR4Y|CbDVT$yt z)rzrH;Nb#}k)unptbCr4p19oLN}jYsu`+UQQh{&Nt82)>P$bcPQ`UWAwU93mtwGuj zEJ&;rgB-3aTqnS-0IC5TlzA&%xExKj`HHiIgB2q}9{&aQ`o>V{-V@OkRZ*y5y(E zGIdP^^kg#n<*uk;x$2~9QwPUeH zPo~?dK)C0$$^P8tt6f;-$31x5l>b6hYBq87rYg<(ub(jZlR;FI+clY{My(IJ?KgiL z&+me5Rnv6f`flrtI6PYWbaNn29dhl-x*Y|Gg5VP~OK&2pj=kXVuRy82c*N*N*$gG~ zsLm-_`gf3rf$ifY$wk@w%a5|HGLj@2dx2tyJY#xzM*?LkPqFfsPE-4q5@vb|k^w4g zrHq@9>W$jn2pCGE9_&t41X@sH9wGs!H zLHGBG(=VLTvQm@AUbvIE`m<$vQTA=$vjVOL z$Dd@|iUSf0{LTiMuXom52^vC$qUO)F9O&XmpOH?EXwDdF2CP!p4y>FgtKf_?2|tc8 zJJ6~P=F?*yg!9Kdio*`)8ypM-z^)Pc2?5LG*|{}@6p5DN5^xBcoZacv1ES69nCPwJ zQIf~O%;?NRp?|UJO2E)QmN^Hu_UmaZiKA=_V7bL-;F>VIZNeLcAh}P> zwmsQ?{HGOf*)S{#CszkYG5gbTzBpt16ObKOC3!|G)YZ=|&-bw@{7&39_F8GR&T=@} zKzx!l96j;B*^E*4gf_UP`+17-;>=YH=1UKJ_jYy$2boqvdrvnQd5b-nW|j3G{q#-%X#HG##io zSJPM_UJ&9Z4Z1jtei{Vwcig_(BjPe%BEL=z?2M1`U273oqFDm*lyA4Tl$1sx%B>Cx z3ky+|k@1)5*GFq-8L~9@+Z^wI5Bmg1dePq!*RBk&Z-^+}c8MlknZZ{*b6ic(D>(`B%>&7dFenWbV zt%h-5E$Ay;Yt;fT=N;Bfixqhvk=9vWuyC_JDBEiz+>tl(9x#+P zZ=)9FZ)Y`@aohjX^)*r8Z)B|b6wRIVos-|Gaf(kO+FDK{|AVrHfxX6EfO_4<2ilKaI4#ekJ;O%HVz=j#idPH{LHdf5z@;u6k2N?ut@C^oQp} zRupY!ItwH@(gM=jOs4%L#&L;roa-sNTZihfwI`h}TtBys&mUrk*rq>po zk)|uLOnBzmduf6W3(@)B0SPyj8{$8EC*!3hsq0p>N*Q13`*o2oAGYQl2Jz;LOs-k; zPO#c$O?&Ff&hPs86J>j;{I1k!JKgMeWL&0{v?VCi|5Tcu{o{`1%M1MRaljkhchMHi zz@M`dvUlixyDs;t`ibwvLn+<|dlBxahl^%2Mfv)Jnfw!)E`auGw)K$Fq?(0)%Ur8T zFsK!|4(w|y1SS508|W9F6RdefQ)tadN&qizQ1%Y>J(d9voz}T__0T8!;m@Vy?E@nQ zEV#+XdCND>>hn@ipNh)$L+y0egw=PwLvamG^`}J$6tv5an7=tR127T19tOq!3{N^D z#$l_av{-}=i{y@N@q>H{pDUIRT_+@!=SYOaRfH&x>cd(84%IcX(&pVB&{EZWno18? zqR;fiH?DYkjfj-eLJ;_d#LWOG_7~#J;777hEO@)$Fex~ub1ZAbk;?q+chQ=x=5|fn z+x^LcVH%47L9W|!EdUXgn;pAn`<^}5dPm&K^0n}SYyYdcfWSrLwm48;K+~R7cU#DN zz;{k^F}d-{LG$V35d6|BUrXO|Qc37t2HLyXPe*s1S)aYV@S4h5>y6#E$z2+A?vHD5 zN20@#$`+k=(-UIhS{>tmvH5tYKeUwRbA4p}>TLfKeRafS?7ONO@6fOATa8Oow|-#3 z!fRv*SnM(hMB8fhUP+Cm6uZ*pUdbdFn!nH!)MZPjopc@$9?}_O^KCgWh1TgZ)~*`? zn4UgH<0^=@Inw+d6jEC#P)Ql1ePXknOpJU}d-!nd$VsfY^MLVHb#*JdsX9cSgqz+bbVwE=X&>kLgv|(2-tS|Gu=GudnMEoZH2Plkm?CXqg zUoU+xuQcXU4x=6CV`@`F8;%q7s6RF>+#`Oig6YD+YWKk!9C)e9x5)i9-9FQ_{<#Ad zXZrQI7Eq9bw~RcowWOp3`QR~C+`-F&SAi9ODN6F#Lp=q`4Ad+?Dh=1)ehOi6*ssI1 zHUHemQCh9c+w9m-m>9`6)fc&*w`%E3!0o<2U5!$e8dV}RRF{?Vuvldt>A)^4l1D&*a1yW?v-%GQ|OII0P=V^7C5KuXiDOXke%`3%4^=pt) zJ5ImWi0b}>;C|UBE{NwhRvl}d!bx7DK19jB_Z!mE>D&zqCA(0>6_PShr)lln%4Ce5 z(D0_V2h_T4UhJeMw&Mn9E!`%rJC+$XpJgT5(&a%m>jnrgo*Mx5gfyLzz&A1_rYm|g z9MIND_I5Y^I=*Gd%t@EVqfT6~h zJ=Xr#wR6m$N1?8lNCk`#AWb@q!R(~oLuOYZaP#qN>yKH#d*()L=EllD3`pK%R`B{A z4Zfjv^_mf)CutWq?~5X$jKFa#n%!=nNwCz=peZu$T$<{^+MbdTaUZd%?v!R??uwlK z?D8viCkXM}#|lC}kQNe81;QJ>5V1TvVQqeq3-{zai}~n3dzg9@g0H6qGg3 z;vT-SsT=N_@!6Ep_Tc}~cS@?U-mynlD+^_#(_ldVF%e)P0!cds7J z(4v<5pb1M;{N+zop!1b$V*C?L4wdbj2SWJ!o#&4{o|%vvodxd1*;<`RfEfZyVaE-o zR;|p+p_!4ue&|iNNV;498z%P}$9DESA#?;7G;q&4Uqt%OCz!v}Vt%|)r#RE+BcRLP z2o{iQuyCCr7!N?ha-GKzMh-)5dX-}hGcUz%bzl>p$kUtt5y4hcx!GDg8+svS6NS^) zwjF4BrF=Rt2N}V0Km4(K)}0vCnrmEZJZG-@^lj8r^Sp5}1is}RY7Lb&6kaGM2(e(! z3hpNc%R7iww}nzIVCQ;%7%GAm@)(R>FK5c8KGbed+8#G;kES;sKiwY(JfkJ9joqkd zfr?qLIy>{sC!VLwr_`+WOvbg={QP^Tjy>P(^{o4twVyN#Kj2xZhEHL%YTp||(eWzE zmynKWQz5cqfE?T`{&Y$Zz5wu@@TTO;bg-Eq>j5q=oNna=Ph2X!h4)s!*{YsZZLoF> z^&t+;OtfZ$%CD{!!YYx*F#ofV`wbDh@OMT&MLKJfD*)Um&Khl=WFBkDj{kyd4Vt85 z8Z@otn_kc5KK=KCM#HXAmAJIlVJWTx#^i$aWGLjehY6*hFb}xc4QXXAE9Wy)82i~a z7_j#efLh1TFq>8^wa%N*y3fEROZI7fLXrA#ru1{=lVM`RVn|E!n=4C@&i+;ff0;{o zw!#xS8EGr|HRY)=q3m5K{;#vJ@91IDnfSYUMZkL7`q%9vJKw+hlrC012E_nVq_+M z_dE7eB^Hzxx^b%&up0DLiO(A&*zxHD^K;}=Y?0|qA!Ff7bq2?76F{H}{u>|!G2F_^_Hne8KM)4h5vU)l44;hzi~ zN=UN)<+_meOxxrL$PK4FSGD%HQfWT&S9IfM$mzoX)6d+}aEl?&&&wbRNdBuJpa%C(r{hnGmJ_CQ+y99rnmNCvkOrulAbthFQ()BmsXOW(EKHna-BUvya zbg$4R*?VepSZrWT+SqIR&-jZ4dR$g~ZQtuxEW$yS7Mx3&eq0^)$3!y?h*=)z(|fAM zx;B72R#mP&JYt$WQA<>+-H-zekktbdiHJ9FW}T)dit^Bfdd>0W!~izabP)i9{mUcE zlb?L{b5*ZS4qjfq)D-=X(WWzV2RuEfhggFgvO+k*^&9N6%|NZ=bpn;qj z)P=vIvRkt?s1-<3{>nPTSpkYsb`adBV zr8>fo+V$@^ztj~grf?c{#Aawrgw+@E_*8vK{lN8{E-vPK1;nlGi;g|%0pF^85sXXE2J|gA)UE>Ch7wJ zKSfkFgs2x${K4P8AkBI1>Tr?zTdoH(e*)Z`tOukD*nJ8`a?sHNY`1Fs56yc|kM=Ogq!c=a$ zINqy0^h@*V^vfB3KpU2t)}z_Y~1i$`r0E`{H|gia*UA14g0u`d5UdpUPX@{}DQXG-1!=n%7`Ug}h;wGxBK8VBwAt zXWAA{i;`)Af3qb?QKW_!kvEam;8pEI^VKKULy2aK!33F1QFqbU932*@)lijve+=bp zG=<1nGmAuNiS;BER`%}-2zx~;yRclf771}1%|{Is`g398O<{1)%Uew117(tk)lIA! za}XcxLe?tYF)!yn@iO>fJ|GHFLlfoohFkj>`@va}b7qRW>-y!68jf39C?ZcrZz&$s zK@BXcJqPHIbRx^fO!l8!*d(r0)U$(cO?@-+|Fmj8_;MP|1amFo>z2P1ema)EUNI@#Vup2<^CHzs+;9h3IWz`@{KAG9|88Jw4uY(H+Hx5!lJSIRmDNlP&uYa~gUnWvDVgpe%VzX^w?`xd@&+mW6Ia zN4zXtRtgX?B+^NaP?)wLsARqu+D$ShOd*zt2}TwIh=iV-FakvAztLfbK%qry=~v4v z-ugo|RJ4c*yMbf%vv){oll2az3HdUU=yh{E*rub+prsK6~P zXds-SKch0WhazEjVP$%LA0sius`2@IefHTl6e^7wCaeZh^ugX zj<+E}aC116?UR{6%f+nE=YIkAf@@m(C65yP01|ZB?&N zYAW4egHimCxKxN`}|sIpf7`B6$|lUWOB}$SrT`(q935Fuy`Zu4^h;ZX&f< z`V)_qTM;!Rag*`ZS-UgY?OyH8zqOKyo1frTeZaNUzkDt_CZXOYe99tCzOWc(&62gud+)%g|455GXacV}7u#ZO`43<=|tfFaPI=1jdfBhHul0xx2@ z4X@a}{WDDkeLM^%rCpz7-ZW+kD>8Wll+wsaL1L+A7fhMuDu;@CP1jNFa0+oB4x+%U zIib_GMv{{T2*^A%0f7f6i1!vgQ>1Y%A&>R#Q_B<;*dxA*;7c4hC^+us*=@-8vqnm7x1^U8NbJmI+vC4wox)k7jZ2VsEIV3hZ&i1J9tG@ zRW>_2tzMoDb7lX)JQ#f|1mjw)vz@|#d7ALxzS=_&NG5>@%dZiH7j22whBM^#4miBT zlj~31J0H%1=3lMEBs>s9zP6_(q~mLwywCFdk*!Nc-QC%ByZBxN6X({!OdEsxA-3ak z#-KlhIrVhpMr&+7IzlYSi6**2g1Ui&Pk*MipiGK4bu{6Y_L!ObXp`l$@-a!@0ZBMF zB|P8&AmtL>=0i7RG%U_Kd|jLeHoa3D;(O`o_yk2*0k=Lvwd7+kOHTy|hH14$UMl>< zvwO7N*Vy=fAn=$i7aJUAWbItWJo7#SzpYVA0PC=tSEz3e2hOLFPPx|CH5c{ydMw}o zghdX=76W5R5RHQcWtV-6j$U(+#2&YrHXV9fI&bQ440=T%_+W=?3hQr3U=F=XF~KX< zYKARQ?Ords_a65KjbL(%!^#hYB#ueEL_sau^#~{0w%0{}WJ-qAF+Y_DggbS z%~wyxWf62@{B`zGWv$g2>lcQg?BKen5CP|kas~BurJ)otBIM%3bs9}zAkPbfGR2KY z!J}c$ing~$sawfk#=RsDhv*P171W-}ID`nUJ(+UMUe;4HcKbf(riWk^x)5>Lz1`1a z^q0i#0|tf{ZHK$~XP+-7?V2AiXHAY}QXSCmC@>?Jza}mZG{TyNpVR@*AFP}GVPm~| z5-?E6GVGoJ^8zRQUISiK1&6J&t0&j&R^zyybL?8ynwSe+G!!T>N;qXbQW2!nxaESp zS9Fe~G8H94Bfbn8fbGy2hg^#D^T#@6X~a!8GWlG*337h5Gs|rBhwEhY$h>e%Ob3be zilJdsGzIom&vVbm8<&tSE-rgDaXCNoS4|lO)C10pG}Y0tw$jFL@n6W_B`5^CNa99N z@6~(dKPI}?Sa{SDtiTzL-mG)a;-m=K6ffuC2XAMw>~Q*?4Py=&D_E|ydEZ|hE&Fh{ zP(vhx9+;fmeB1@azvQC2#JHX3Az7~{79q6ZEUrbW6<%;imSUcYmgJGFzL`Kh3GOk= z#2;9XB8P-dDblQK3q+0&hks>Vk1;TzK7Ml_{RqR&%MFr6E-q!IYfj9ROo|yoL67o{ zraK#~q~GeqteA`+KqpYN8XKFkYkmHF%q@NT!z+rJ6V-hjnFscmL`y#rkqeN=#qI<> zXGDF^dVv_UU)}@4di`!Tw$(m1@y0S0GDi6UC;aNH!CZfUG+!L-$KSd)`#?c#ROT7h z*qk!w8+9+k<)fu|%K!9NUgLvea?LoaJxZwS6hD2zhdx?%=1+2RONM8#g?qa)e4p%r z{H$vta&qljJ0`|Zy%6_qQvA13Bk1srXoYk(<-7?N(z84~IC*@bg%_Bg8nYbAwili7 zbhjp=@q@jR=4=U;6eq{d)Ht8-*s_;;bDnz;>&oY=KRG2I8|>f=Oueb>$s88VAkR4G z&Q*yMOJAPJ|ALb{ALgRkO1Z|g7I2bqps_cmN(7`x;yrHKRqV?|51oCdfvGgF_$JVp zbk>!o0bZRvtE!D{NjNiT^?cow$+RR(8t&Q>x0|5MOcK$~lyXuwK12T{n9|-zFWWQF z8$K$KpGuTbMNi!4UeQ^wtje+wg3Tz~uA0A_CdY+od#%}4__fc8rLEAIZ1$W~xhYjO z^z*1T_hAJrN^c%QwK_MCCe2Z&6&T1c*U zeL(`e!apv-Qfbm~N`E)E5GI=OzsWTp_mj*nu+59hSYjeO^Fzrpy7azOUc3s-_PWa0 z|FRO~`nul?=f{cEB10yPaVCY99rQfWR4E7NKq$7WUG$`%lBbCXy8N^a{L($Dc~_md zrErG5`u)rCt<1g~&z6zgi~65;jx#Ac5k=b2Y}UME*9>y%48^Bkfs30zQ`s-7cC24K zr(~J!9noy4*=eYk%hC!NEXm5NiFj>SY{&Hbdo&4?Y?^HOq`3%1wMG(wT1M3`J#xbA z0$!mS{%tXS-ptoKtNm#b>EGQN$g@iwTMjDe8zo}jk!ddpPG37cfBXPKWnC@Bn1qqN zq=fep18{tVOc4=*x9Wy{JzOjBw;PEh>p`b1O#K0R69k)8Li(l|)_9&ceLjQ}S=&te z%=$yQhJvnl)6y@O%$;_=DH+f~b9|3@Vu2o8%uYfh0^po7EW83(E+7p5uMF+3T2fmD z*L%i=0*{oY^&4vE$H3O{+Gep6f=YVOWiW-2Y)dp(`qJB;k|O$O?ZF=Ghis+d)dGO{ z(BekBgWJ!weK~!9EoACxIN3I<7Tg(p(2tuuk|DPp>NRF`)gsq-KL?c?V*m_DM&7$J z@u}#Cy*ZbxUE=#TyebHEHL)`3mCSx5%3=(-I^+xYN6Om%Hh2eBh&vJ~uC5E%1Y*dS zG_=67Gi+QHtvx`*(obwF_aQ5=Mbv35%QactJP+@ooSYf8H~_5D$TsBC|N(8CY+ z+#N4*Q^Bc)mLJLq(pt_8lIb>%lvKY;i@n4+};!o zcSB22tTj6dD%dZYTe|*W0X(LHN#$i-l6-TWz5& z@0x$nsSPr`+h2}abpW_bJ}_5?lkbCG0s!4io1FSk(xo4k><6*1bLqHB%85sVX#?k` zSqVkQdbX{44RG_;^62?ScGKxl^F-&ici%49Tf#t6xe|ibYGsBi^rFEvR(i(5hcT+y&nK%`!Cv%td6hG?p9%$5C>iZg~-2Ty`T=h|+7T7p6+HExPyTjL5VE*l=BMigDfVF5j$BFT>?nfQFs3mq=`==N5 z4Fgz_E(FJ)wbm~b{Eci6caf!RCXD5WM;>&delPth-2U)&PlrV}T< zz;^`LN;$C;fX>E~d*c`k)sVF{=!u-@Omnfvv3z2*((H_QR=*Pjbp=RlHKmz*C1}OL zQ9#nMuf;v;J~PqH4jC`KMt~7GkV{PHpr@HlHa#3c`~H-a&34AjhKs>oBaT}|-^oNK zixC*FA?Cri8_PG{n)LZ2Ah)fPzN{x~!vq9CGEnu%$Y=WU{Pzz3tZAMhpJ_w%ehSjg zt!&pmG2*tS3!A`#n(1Vg{NO4y1DVt@D)b&k!t6uTfZ}Cg{s@R+02QF4%+#d)mbV6C zN4Z&3OIm^$<^DXs6XG0xj=uBPcSfh0H_`s2R-paLa9lDO9&^U81%m1vt&v)}iUPh+ySLo{yv~k1t)zYO-mT;Gl|(Kw8Y)e3r4*>hA-6rZtdJ>q(PFFT=0@Th z$8d2Yzq2yyrXP-~5&Gw=tj*Zu>uIb+6@Ms^{P#z0;vNRhpT|{-SSk2zJJ@7J*W+Iw zxYe%m*}Rh#7W(1XlHr(Svk2Npp*fS-FsUw#MR=2^?w2|>eNP%!#W=LibV>A;e&A@~ z3(tG=aKx)Cj$Uv~@W~;(7QIHp(C;s(Ib*6~YP2Xf>tqFF`1zA|@Yc31+OgsQkh&&| zMP%Je*qYiEF^|N&Vhb^^qE3u=>O}fO9!8Bfo}RDdDcezxcnt3-tPVA^k*ZUTjQ$nB z{&6s-O>}Fhkp-D|G+kZWCU7x;-f4q;6}$Gf#+$ng*omDRr#3mCJcH0ZMueeeM&KQF zD*BIYsl%mNhh);B46~+Gv#Q^)0ht4o8eJgUI$h=OwC(*oG`)TCpequxpw2YCEM~0r zZqnG=H~l+ap!%|t%arM6x&tzNKT##6SQxbpHwXJENX8D@pRJgyLhZI9XO5tQRzHEh zZ=8HJGu4&jm*8wW=?=UoK4g5=aC9Zm)ZXQs>Znop+TAyyVUzS6Z&xY|NYYbH-@k?a z<$b2ya#{WmBUIaj%Z1?VEh5``*l&yJ9hluR^Ÿ%zbxl=~Jrsq|1 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. + See the `main pyAML documentation + `__ + for tutorials, how-to guides, and an overview of the ecosystem. + +.. toctree:: + :hidden: + + api From 01f6831123ac00d7a8f8eddcc31860d5b2e6957e Mon Sep 17 00:00:00 2001 From: Teresia Olsson Date: Wed, 9 Sep 2026 16:45:45 +0200 Subject: [PATCH 3/5] Update readme. --- README.md | 90 ++++++++++++------------------------------------------- 1 file changed, 19 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index a65fd1a..438b351 100644 --- a/README.md +++ b/README.md @@ -1,102 +1,50 @@ # tango-pyaml -**Bridge between **[**Tango Controls**](https://www.tango-controls.org/)** and PyAML** - +**Short one sentence description of tango-pyaml** +[![Documentation Status](https://readthedocs.org/projects/tango-pyaml/badge/?version=latest)](https://tango-pyaml.readthedocs.io/en/latest/?badge=latest) +[![Current release](https://img.shields.io/github/v/tag/python-accelerator-middle-layer/tango-pyaml)](https://github.com/python-accelerator-middle-layer/tango-pyaml/tags) ## Overview -`tango-pyaml` is a Python bridge between the [Tango control system](https://www.tango-controls.org/) and the [PyAML](https://github.com/python-accelerator-middle-layer/pyaml) abstraction layer for control systems. It provides a set of classes that allow Tango attributes and devices to be accessed and controlled using PyAML concepts. - -This library is part of the **Python Accelerator Middle Layer (PyAML)** ecosystem. - -## Features + -- โœ… Read and write Tango attributes via a unified PyAML interface -- ๐Ÿ” Support for read-only and read/write attributes -- ๐Ÿ“Š Grouped attribute operations using `tango.Group` -- ๐Ÿ’ฅ Exception mapping from Tango exceptions to PyAML exceptions -- ๐Ÿงน Designed to integrate seamlessly with PyAML `ControlSystem` components -- ๐Ÿงช Mocked devices for unit testing without Tango runtime +Describe the purpose, scope, and main features of tango-pyaml here. ## Installation +Install the package from PyPI: + ```bash pip install tango-pyaml ``` -## Requirements - -- Python >= 3.9 -- [PyTango](https://pytango.readthedocs.io/en/latest/) >= 9.5.1 -- [PyAML](https://github.com/python-accelerator-middle-layer/pyaml) -- [pydantic](https://docs.pydantic.dev/) >= 2.0 +## Development -For development and testing: +Install the development dependencies with: ```bash pip install tango-pyaml[dev] ``` -## Usage Example - -This is an example of an explicit call to a Tango attribute using PyAML. For more details about implicit declaration and broader configuration options, please refer to the [PyAML documentation](https://github.com/python-accelerator-middle-layer/pyaml). - -Configuration file `attribute.yaml`: - -```yaml -attribute: "sys/tg_test/1/float_scalar" -unit: "A" -``` - -Python code: - -```python -from tango.pyaml.attribute import Attribute -from tango.pyaml.tango_attribute import ConfigModel -import yaml - -with open("attribute.yaml") as f: - cfg_dict = yaml.safe_load(f) - -cfg = ConfigModel(**cfg_dict) -attr = Attribute(cfg) - -attr.set(10.0) -value = attr.get() -readback = attr.readback() - -print(f"Value: {value}, Readback: {readback.value} [{readback.quality}]") -``` - -## Available Classes - -- `Attribute` โ€” Read/write access to a Tango attribute -- `AttributeReadOnly` โ€” Read-only attribute wrapper -- `AttributeList` โ€” Manage a group of attributes from multiple devices -- `TangoControlSystem` โ€” Adapter to configure global Tango control system context - -## Testing - -Tests rely on mocked Tango devices and attributes using `unittest.mock`. To run tests: +Run the test suite with: ```bash pytest ``` -## Project Structure +Install the pre-commit hooks with: -- `tango.pyaml.attribute` โ€“ Main attribute interface -- `tango.pyaml.attribute_read_only` โ€“ Read-only attribute implementation -- `tango.pyaml.attribute_list` โ€“ Attribute groups with `tango.Group` -- `tango.pyaml.tango_attribute` โ€“ Base class wrapping attribute logic -- `mocked_device_proxy.py` โ€“ In-memory mock for Tango `DeviceProxy` and `AttributeProxy` +```bash +pre-commit install +``` -## License +## Documentation -This project is licensed under the MIT License. +The documentation is available at: -## Links + -- ๐Ÿงบ [Repository](https://github.com/python-accelerator-middle-layer/tango-pyaml) +## Contributing +Please use the issue tracker or submit a pull request. From c1135d870dd2549f7f1ce72ed8fa734d93342b0e Mon Sep 17 00:00:00 2001 From: Teresia Olsson Date: Wed, 9 Sep 2026 16:45:57 +0200 Subject: [PATCH 4/5] Add copier answers. --- .copier-answers.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .copier-answers.yml diff --git a/.copier-answers.yml b/.copier-answers.yml new file mode 100644 index 0000000..69f2df1 --- /dev/null +++ b/.copier-answers.yml @@ -0,0 +1,9 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +_commit: 0.1.0 +_src_path: https://github.com/python-accelerator-middle-layer/pyaml-repository-template.git +distribution_name: tango-pyaml +html_title: tango-pyaml +import_name: tango.pyaml +package_name: tango-pyaml +repository_url: https://github.com/python-accelerator-middle-layer/tango-pyaml +use_docs_extra: false From e98b50133920ef078e3f293bac1891427bacdc49 Mon Sep 17 00:00:00 2001 From: Teresia Olsson Date: Wed, 9 Sep 2026 16:53:10 +0200 Subject: [PATCH 5/5] Modified readme. --- README.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 438b351..379b3dd 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,22 @@ # tango-pyaml -**Short one sentence description of tango-pyaml** +**Bridge between **[**Tango Controls**](https://www.tango-controls.org/)** and pyAML** [![Documentation Status](https://readthedocs.org/projects/tango-pyaml/badge/?version=latest)](https://tango-pyaml.readthedocs.io/en/latest/?badge=latest) -[![Current release](https://img.shields.io/github/v/tag/python-accelerator-middle-layer/tango-pyaml)](https://github.com/python-accelerator-middle-layer/tango-pyaml/tags) +[![Current release](https://img.shields.io/github/v/release/python-accelerator-middle-layer/tango-pyaml)](https://github.com/python-accelerator-middle-layer/tango-pyaml/releases) ## Overview - +`tango-pyaml` is a Python bridge between the [Tango control system](https://www.tango-controls.org/) and the [pyAML](https://github.com/python-accelerator-middle-layer/pyaml) abstraction layer for control systems. It provides a set of classes that allow Tango attributes and devices to be accessed and controlled using pyAML concepts. -Describe the purpose, scope, and main features of tango-pyaml here. +## Features + +- โœ… Read and write Tango attributes via a unified PyAML interface +- ๐Ÿ” Support for read-only and read/write attributes +- ๐Ÿ“Š Grouped attribute operations using `tango.Group` +- ๐Ÿ’ฅ Exception mapping from Tango exceptions to PyAML exceptions +- ๐Ÿงน Designed to integrate seamlessly with PyAML `ControlSystem` components +- ๐Ÿงช Mocked devices for unit testing without Tango runtime ## Installation @@ -43,7 +50,7 @@ pre-commit install The documentation is available at: - + ## Contributing