From 92393824aaa5552a72589c349e59710a069aef1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Segovia=20C=C3=B3rdoba?= Date: Fri, 16 Aug 2024 14:22:11 +0200 Subject: [PATCH] Add instructions --- .docs/images/k2.png | Bin 0 -> 19957 bytes .docs/images/registry.png | Bin 0 -> 20087 bytes README.md | 173 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 .docs/images/k2.png create mode 100644 .docs/images/registry.png diff --git a/.docs/images/k2.png b/.docs/images/k2.png new file mode 100644 index 0000000000000000000000000000000000000000..f0c27e3488030983623ab4704492fdd0f691e8b7 GIT binary patch literal 19957 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

ty^aKjE(VDGd5@_7kFU1E)s*x^6Zi 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 T$|B70M(<$b1aGkV`O$v>-3{ne literal 0 HcmV?d00001 diff --git a/.docs/images/registry.png b/.docs/images/registry.png new file mode 100644 index 0000000000000000000000000000000000000000..07e942d9976cd28aa5459f86e2739e26ac3a00a4 GIT binary patch literal 20087 zcmdSAWmH^E+a^kkga8SF-~`tojfF-6B*8tw8*gab-7SFzg1ghf-Q5Z9?i$?PwWkB` z^Un9KbAFteGi%oR_K#k*d)KaAb=!4S)m?sHrA5$R61+r0LP8f46_iCndiohrzI*W) z@vAZzz>I_>%_k=KS>8coch1q}?N|!HX`kf0-kE>DZeTs}c&}C;wi2=v64Paa9BxBX z&-U7G%~9Ge;}sjFhnJ(`r?=0ZVSdIJOh_dS?<6Jv2^U*1HG{MO})Esr8%NEh^vWNq`60ZC->p5 z1&0;wzT|)j!MiUUPZ#xE#@0J_aoc-=N;PxFfH}QPcWOb)?@KKWT4!jD;LtO=F{TO$K zlRMi*Up`b9x5RBW@D0xL#fWsP6=Xw%%*g1Z~r zWUiz6dvEwL*XJYa20!1D{YzLIG|{ZRE-=mYi(Bp%_l84wy~H&?rp~_v_sczDfVtGr z>GJfh);*Evqb3|4YNE{%4@7~hsH%3s;8%t48p~y2Lyzhn9oB$gCJG7wfOQb&ihAF3 zXu>i6+Fg_8%y;)hJSXEkv(G2{q8wtPqLU4-*LSzqBg4a;u=)AK2E~ zr$UMhakVC=F8&?sOllmKlGaub44z`tx*NIeD0^EoC)?HDVN#OTdtG~gJ1)`K7Ky_& z%*q94jef?FEHbu-3;E;l9=2jF!E3o%yxIaaWLTksBI`Ldg70|hOY4LQByc`X6c-zB zwi3CULGj;2M113QTn!LIWg(HkEOE^`{*% zsvoYheaJA!O9J+wf3~d=WB|A=QWiuP|S@8&@^IT?M!s8X1LA z$JFj!AxyChK8LVgMhKf^bF0)zWQRT#GD_iv5KVkEz&*~5OF(nsVmQn&aA>^g&nirw zbGK`ZFn^!#@W9JawG;la_}BXwy_m@*-IIKucHOHXegSfEJ-|+xq-3UhSsw;QV(kXi z41F^>hfL?-)S5b<<4voGMusjQXTv4I(`G4Z`xg7y4a zR2~OZqT;W4PWq~H(N#)rMlWx7z%y5!@fhKEjBata1DYjN#$;X08hoF@8RJ|s!wE$; zU&ckrY+FYQUA{xTPUSj+>CF?kj7^m~+LdrB(@_vx?KYAQ1#?nl?qeBZJF3mD*Ime`MVjPT-0qb^Sivhk7}R%ScD}!4(-TV*nPYg z#0PFZ&|QnCIhI6g#K}j%5dq;RBEp!mKp8=(*Unc;h3*r^wTG}0{6S+}jY zA|iT>?93lvIvcFqfz?7Y;69BS@o8^h=7htpDS%msJS4#tnQ11_UCc}==hPF!D? z9!8FBGe$e`vSzY$FJMv%XY^sFw5@H*=>?i%NxGh}9CeT6`jg+>%4YZji{&>MCoCN= zy)va0>Y{pSax9}Rnmi)uso9mPzW(X1OYmE=bj~$ih(Z>t0yoxU>4s&@3hvWy4JI-eSU6)%HQEN>jyd<`b3j z9Xd9WN;UKG;=Qi%ZU{da%!0M|2!+~`U`UjO)0UwNt(?Jl)4}HfKlYTvoVChY@iN)a z4sUtA;b_^E_Cs`%%0Nd(H$j9e#l89Dn&9c=4*Zc^D|KY>+)JJrb?D(W zPcWPPmTSh=&3C+`XvU=R1@_ie*(^2}W9dsJTyFeG1oRh3qqAjwzEUAb^&Bbhq zU`0#hEOCN{L~wI7Fqe)V6+I9a3r~9dwa;*VU;H&jm^`MAAi@S6uJ`v6chX7Vuy!0+ z+SNj)LSS8CD?bf@86JEt+$V9j?-RFYB?mn`8lnnN715k6>Q6{HJ_4>utDO4Isk7vg zxR5Gp)?mmJ@oIxW^!fdYDB9I=RdQPST8IPkqk42sc{}k>rbGKm17k9w_^90_7!)Z|G^8Nd=T#J`x z*qb{vG!7}vn&ka+)!9}6csM1qOE$?w6isL0*?nuf2=lmW@T`nE(I(N6-q`xN$5F)g ziVFZcC^J+Yw<(Bc(_i$es5V9ACc$PxR;@RYP53a0MhYNNSG(OA$L}G*AV#Wp5ij1g z*ST-6=|ceoPkVn3Wa312N32$SxmTv8*^^oWC3NBmbc~Eq6?{hsbJkkBfF!EEmo)zo zOZSn@blG1b1K3eTM*S~0Q|o0W?xX)o60Z^ys+tfLMSx@AXj8&7NN9cn+MK#PX(x1f za<33(jJ?)>s4wdO9`*e{#-aZ^Gz2+dmDGv78$Gkqz9CtjvVZWxGQ2djaLA~-bLLrl zG57bI*O%dm57UTGW2CwG=!PZ{287%>|VhGsJbl)q*sKO*OOpnyoQ8Mc7^ z&RQ9p$YOkGo#?!F=JWg7e=MA#vAi6ih-h?#!^8W~f{!zsq_XnC`E~B(2|2lWD9U8@ z!-I$_U`w86LYFYEGvu)y)5D)sX1&aYes6e17zX4NzfhBg7a!kaE>fqJ4s@!LZ-K8M zVOkL^K7qC3zN1O=Umhz#4QWRt8mvIP12(}-VWe;hM}NuQsE1~otR$d^$FDz@=c{4L z6UW=aV!)kn(Rp&LaL}aHLlw%|Fffj!cv#w7Hz-*rg9+E|$|{yxLdcv&gyH)W5};pSFvI;WK>~E)f{}}F;nwb740!!aVvy@roBJh zncsvqhzCeJa#U`Jep@WHtnu(P4#f%Uhg{ob)jZ>z99#MPvF0dc<`+r{v`+o@;|H|r zM?0VHxNJhuU7&uxFK!pLKE%sj;6r=A=s_e#5Zt_so6Oi;Y|Oi+eZC#KefmLP9F-?k zKqTM=NFIEbpT3$x=M=&--2*5oEs15g68@}qqQyAfLt~RQJwsAq1P@sid+0MecVUu= zxjVhIuWki!X54{nBr<>K-SwXkBFQ@Mpl%tadT>S`S;5*?%TAQEw9b^DH%&La^xL$R zi|Ta6Fp3{1GSy~>M<}AcJ#hJC#W3!0KQ^qFoiI(`?rwf2ruq29YBdsUV_=~TtA9y7 z%Ho~fJ4~Ed$Gm_#jfR%>+ z2`|t}9kWmDa2fHTq--VW*+;K~+_O`@ee9XO=HPvw1!!qKu} zcZ~%{Iywx-gT+**lInl?wR>YaBmBI!{?@XV*!uUo$-a5e$_3ARrNfJv0jx-#v)`XN zV>*vs`tl5t+6b9xt2@}}RJCLVrxEtB8gKlrpw5+@0h09>@E96|-q1}jQl>-F<>|)6 zW%ZBr#hl7-K`m<}f{+-%}_Go&!iEr|d+i)2R%C)#4H)UO^u(vP{8C3ll`NGdUclCgzNO|f#h zJVq}ZA1ptLuikU86Ib=>$H0ig2FJjX&W*mbb|&{Q&)clLNqhZr{K7K<^*cogAg-@5 zmYxLdY-f3Y*QxiJy%x|}|1h}m_T#r|LlT?w--1yxqTLf^xw){H(bb?K1g+Sq35VjW zefn+Z?~k8BZSQ1bqEnXqfhnCW^W;mog|uPL^xMzw-$AS(fe6|RcFwHAl_sxL%Kg}Q zxHO^iv83RFDiHxaGi8E0h{J69*{r8&>T?ARl-l@NVyMg5$?+)j3Ubkt%k{73)x15f z$eb-i)5=XytU!cDOG|a%Bkaelvmm|WYHh1PIW{C>%Y zftHcSKU_98D+;|H(S2nFS$uUU;M>QX6VDkJ6of!Gv^UbDj>>fsFO0cj9+*29ka{-%c&Q?uCpquEJ{GKD>gCz zu!^sYR^GwS-&a3<<*1|u@^q*3-!z8Y7%cBpRh5uR^ga2W+R;YUKi(m_rn@bp@@}9) zW#=bGViLa4RCiZk5DYAtP!QZz!t|Xnp&=_D$ho_EBD=6-B(Z4TG(KgEGA> zb^2t}1F3{%TlR7OZkRcPJKa%yeLi+V)Nq)9wihowwzIJZqh#mm`aK#))m|XmXKBI+bn$w%H^vH9y_TM#Zh> za>l9`Kk{oIhLcO>_D+8l2AJ1Iyu->FTnu9Cj%LXIv~XfY@8710`%11GJFBK7&6|_B zPi^K|>#9+9MO10p&Kf11U`3$H`vHKv!Rxl>r$_kEQk!&c`g$`*rI~6OJHph$+;aIE zPV`*pT)~Bp;*4V7CQ-%Xf<%Ig{hR_tkcso|d{_YwN6SS38r5~s?fa1Y`1DVv>tEA( zbIl)n@BY?(5(^eqAedCvPNizWNW-XrfGQ;36|8Kutd83(aQBEgx7pRlR&T0FtJPVs z*r>SN;U_=cRz2+)Nom=Yj^ba-u%GIiG#&0xu2cdv`d&JYoyY+X=cdDUh0rS^x2mdN zfAS2olL8oS<#I6Qn5o(@H`dz-FAQdsg^|SP`;(flQmww|Ah5a+4IbF7*bm(5#XMwO zttK*BB`mJ_nbcS~qn<>Z3P_n40Y>${lHE7$8En;TtPe7|l_F^e?FEw;?&Q!EvNssN zC}xr<7Ege3j*eFh&i3+tDbHSub8YV|Sy`g5DF3Q?^p%$PjLwvid%?F~{7T#WTb=0# z5TBR9drchjTcr2^6{|qU%$=U>9=707Gq0!~D_c<{6KA7h8$$4dlyc zq8>)9-;1#e!ve~;1qO$Lm>jTx-QK>rt~U)75rjROKb!Rmr)2^BbG@@UjZ@=>>RmzF zm%Kd<>A0nGNpz{Q|mbI__C_7FTJeK-}(IT`|24I7m;GUlzEzx5l4~D zvh=&P;MFEijzKWOlCtzwbJTpJWkglMnls)`DmBvusg#ade=xkZW}GyTf~GgyyyvCk+jZ6}o6 z7v1mx@Qr?}8r0dG{&%>YxrFKoYt~uANmT5xO5Q4yCe{G>oM)!JC@j-NMh8mf9g;G6 z1p563)I6bJJEH@6RXA@K-)7#o);JMi0$e4^ddu<3x-ZI?)aoXmW9%lsz@?E+M@aT6 zs(H(O&{}vb=W8u~mw3*5x4ww_!Y`AMz7I0qs5-2$U)=#lPC+cdB*t!6zT7_!fx1M! z1I$dg8s(lXm%%f$x2+uk zFXVSk5z$?fDjhnhq(GZy9ypuFu+`lSSDRgrCv@Wgx~e8z%bI0Z@h{K@1ScDRbu$Lx zW5y)W2B;AHoc5C7-;4mAZ2xY=p`zs6OGsOzI~1Dmdh*$v3iNqO{W5($=cwa~-X3AQ zwB^wY62tRfRbRS4$#~KM0e31Sf*2B{tz^9|Ard|I_%@bN!GyhIiC`PStV!j_bXwE1 zx~O5WvC~-LIIpp>;(YB`6a_=AK37>;_GR>R$s7oz{tSD_v;}i%iz4@60}Mz{l0x3sSavzBhb^ zmdDn85e|C6Al1bquSO+pQIMv*W7L7U!q)3iz|%qTqZ#%j30!ww;GN}80WJ8@137Jr zmmMLNctc4OrP2sLd@Tj9iCqiC20!BaE!MGlH|g*R!1gM9Q0>utw{{`(N+Bxvv4$sw z$kVO@20c1)5w@PStx=|5HP`-gZTu2PK$?zjdee}b+i0ab3(mJQGFr6-o)1xVZ_=mE z8a71ZQ5rbZ5}_hNHL4hRW0!7cfd0oONc)-E#}5Y!3ZQ&R-IW=MGm3OuebuLZ%x=l1 z)wX3f(6IEAwBEvato5&}y#DsR;MdyI=*mzKH&rY;luoLt3xsM@>{^VkVF zr!W8X{Bm3ZZ!;i=C-st^xPw&*l*h$U>eZEPQh-}SXGzuh@wI9OfNZBdLsbT$-!^3h~0k}-0*&HZJ@5doZsOx0uSJzMRgZ)n52s3Kju>eLY zA;>IgWJ}!jiXkz2?@ADGb9Vl1{_U8PKz99&MhQ%oA-wVJ7&<2@!w(JnQMFVjn#trawW->bu2)3tfS$MU(zlf8J3iZ}jW}nhP0aem zDC$C$#hD*QZ0aqo2qJPPk>^{pIDgmi!%z8NU#0;N4y(BqPcTS^~C9Qqy=R5g@;5#DH<>9%T-k7Pdu`! z>k_ka+jaLe*@jeLnmMOZSb5RE-Jb93+wI0#i5hxkQlN~tvQOjYGC6#79yh$3jY2gZ zj3+>0&1Ef?1L1Mk#4eyKanVr?S70>xg)lFcmV>|MWvFmH?z?(KQ~0Yjyw8U2dHxgy zhjdkYJ)e7?gXFh7_XEyFt{=dcOWH0s0;yhGW2+o&&p&U!&)q}Q*-rgh^-p|D&t(*{ zeR4*Ce=CWec*kqi|AO6Z5VFVE?~)qirnx|j7s7}}Zwf@A=Tee0>ze)qNebqNQ#6ZMDTt={-~g6{W7)%Fsd+%Z-Vn z1pRF`&eE)?cI|CW&MOpjh0Vi9vVDSm9YfEw?ZjtLMpii@L%j>?sM-=OzI zY0muMs^r$O;qTn_o#18rvxBXDsdJe{XDBp9>`_$tS>jw(H#PZqNmM2mpGAmVmC*y{ zh5a;CepzbBW!40-&hN=UZ;Z>831X~~KI^`Caa9JgzU|*Qn4*$uhWnnk(*pl(7E$(u z<$ItCZqAQfK+fuTrn0@UEUmjGNZha8nB~4Hd!kB(Gv&{pX^kG2D`*pv=VvazOewTrL(9BtUh=9X>$NC$703Zx%Fa54}UB!lxI!eN=(An|BMr- zz?Pf!{U<@Dbb11!@K9~B#T`u3I+w@8SQ493Uz$_NGN2%6(u%FCU~}^Zv*vbvQ3;`I zNpXVPph99OAYtoq^Kk74chVKC1cuoUV=mM!R*sUNl)FWm9ec{rQdLN2T(;YgUEe6` z(VdaVKgA3FFf7pS7a=;sw76VIkCqW1q3OXib!O7%abfQz(B(O)#ago7+eZFqETY-cq<7*-MGvX4|^hKhLm;#3;Efgc3`d@bkvz2V>J5 zjPx<4kTBiJCdHZBbFV<~5LPr722N15AO1^$(_%kU+}wI`U;9uFp`PsK{LU|B|Kf1z z9o42wjLqL{LhCqa*Ws@=jIm{2rdFCn1cpcY&yx~y=c(foVe*i1vwqQ&r(^^*JSI?# z(kXtw{YAoar#p;EXwd*?mB%JieQ&K*dxlod=Qpp<8T>25oK)4ryp9!Hk@Gy;Oecp? z7pIk7ZN`qOH`l^o)h^Ml(+mB^EimCKk}x?t%|ZZt!T+EbRQwIyu-sWI_uhO7LUj3n%1Z*?A4hGO*ZB ziY^$y7Ul1?h=qo4W=dv<6X<=-Ph{BNN!Ggv%p7^kT=z;XM7`amqvf3#ypfPw5RZJt zbEQr?V+Z^5mitp$@Ywr#rLRR{d^bLzpSOqhf?xB+INjsp`=j65=&tV3((=v>o(O5j zR31nzXcFWEt*)9#18uPtM%EqJBl$!dm(bRFsd}syDH78ci+&$vdz=dJoX($N5?7J+ z&O20OX~}>uu@4>HU7uTOL`D#hXQx4)4JlROL*?8pwPAm}&b{j6MvtGg`4j$lDeHyE zR46-9j3n-)cgQWf%ACF#SN^wsY16lB{_M?YBLa7^k9hS2xu?#=TfB+T6wGAqGd~$- zm4I0|$@a*ua5!s7?4IWxQ+d}OiT7Ka=QUs{Nc7}i{iJZb^yz7vBIFYtMUlB(VhS?- zUZE3IWi#dK!xb}0d@y_yeY7-JeJMiU_If4xezKS z%(^bfS<5NXb2nyCZ=bcIR?;{2Vg}Bc7}U)VirSNa$KWb*7hkJ(1z0vADJ1^kMwlDG zz{U?sd<>2T@uy6as2MSXq>G(eW_*ll4dmIu6)&?289KBT#=WB+Peryd2;CWsYr9sI zl-7DUm5=o!7>-|C#kY)CKb&9f!jogBq#PbB&cwSO`yXn2k7=0tN}Od!+z3!>tadQ^ z)7bMD)uxvdgd@ijP2V(sXn(Yc(#AgoBH)+yLt8SNyhpclhREIDG@L_r2@uqk4JBwb z5A8v3fjEbAXN^miUXK9RJxd0q9n|LY^JKO50Ml6M_D2YOXk_8_1$7dIN4x=z<{P64 z@0~^}ip=^~(#*$h(m5R4Xh`*>iVsXU!Dr^E!_g=M$`{qjE^iAVlS2!SR|$x@IdWw` zdJh7`Qm?EkOq{)0bRC=(xo%Yk$G?@Q6OwOs(J{PVuXA|%=0;YvMu&>(4mJ7f$uJs7Zkjk&$#rox5)5}Ug{oHpza`QP6AbeHcZv?|foV$SZ>LswnV#}Oy z&`Ci|;9Kq-Hf(tH3ObsBlZX|3@qJr&v+eF@d`jiN7OZgG>2|oafm#5V$5Wly1HrcG z{O0|L@Kiggr~@PsC&SqC=Mm1bBeF4l8s+Jb0hR3{{d7j`Glr?W&0^2Ta?@HQSsmUU z?~F3%A{brcfVQI6%8vNGb;5`m6_I$h5n=R~BQb7&N&hqzNu?gLGt_I|DP6l%62U=( zGb0?!jdsOV2J_L5MTv+mkk?P2n3{g65XS#EblpU;N`x9lN9}gA*3Kp?FbHPdZ&uX0DmgW$Lg#s8W7u0yt7PLA$k$pC^1#6;+71GDt#8V`Qr!0w)RORm~5J) zXcvKme#623L5%1qb{By&p~=;6u8N0PsFIVztQqy0b`!Qtojz+BNJ`j9n*Hj%5KEJ% zauZN%FGOrfW}-G;LEwX!R2pt%pfo7U)o=*uc2&44XC?4rS7D0^VHr<+7nBvm<9RdF zn-9r^l~a}g6sv3U2+eI-gz+^?Tc9 zKHDAplhtnE`h$sKvP~g#N4IPZ|uvL%apEb!vBo+P5oU9Y?~rh zrnGtBzWBkQ9Bmm_Q22gIGwm^w$6XW1%AvXXH8f-!e{EHybgDCXOSSB6Lw5MCdHPk+5N{B~EdGwa%RQlNXatLlh+9e$vK=HSW9iKx;e zYjyrMBH>K~*)7Wisq-QU64J@@{;-yp{jSVJRWaa~Qr}D_|2XUFYKVV9`+Vo)8Xe3K zl;46u{(NM(jP(%72yFIIE@XaX>pc011}WMr04xNh`FPEp4Vc&?)8Cf;7O4r{B8o`S zV(-UdQzRN&^ZwpB%(~||A~K{c)Vt&ZzKRA#%Mr!t@~LGi1qGI{_=4?k#Gvv@z``En@h6ket0mvc=WI*F36EO#$9MGEMVo*pu%|nBJJ|gu6FnZLzwogA9?V?FDha|yXI9nRsNqqzH_x+N z@T8#Z73`oYlB@ZI#;gk4fBE9oKba=M%mJ(cR62Eo(JV`MAyylS=Vx_}8%YNSc21e3 zP4^u@><~&ov$K-%f3#wYwTp_gxmw(`E>Ydq{CM^t{67^e46FfoTCYeh|AY@nmrErY z!lMQ{o9eF@G-}N#c%p^1J;>IWl!y7Oi90qdP0v@~1|6V6P#@F{*4|)~)RlUIf;Yf- z-aYqwF}Og@m_$d^15|%zcqA?+gwB&H91n91jrcW3cs)-Y`;+k@i2?e9te?38X_>_4 z^`*6!<}b$f5TxVQ>C8@ea3W`H;x``IqtXG}(DVqUT*`2axq3)kbgc#rsws>sIPrd9 zNYL4@dNJM8!q-R?C2cXLGv^`jpm=ug#39hMP5?0f)1biXLURB1N|yWTErTJtcq~mO zj(fU@7miL}&)fg${PYYjw3KCSwP0dl@|@%E^4EP`ye|Ub;2fj)h{plD#4(T1n8`D> z(PE*aiwy~n&lvxy5(0)&Hu<*VmBRnLIb-xg^f8SNKYU=}f%b&Ca}wjX&wVWXgM^Q)6;e$0{q=n|R?{O^v?fv=fu|(*#}Pc9K=3?1 zw?kj>JtXWuN1Sc=5rF>2<>8FOD@39`GCm>s#Y4hA5#pQ!8tebp4{L?61^iYvaa)txnpR-7z&+fnZG*T)0= z?#D;B+1=rfX4?@00GhB#f_tJ$A^Ll~_0>#~d%e&Azjq{>sf8}J?rtC^p1;QknmjC+ zTJTUi>TQxbW5+ICKeCOkZscz_C$h!YQm3tB{2RYd?;Ol*d!nD;iWk~CMs&Kh{8lg1mxURT|k2&i$Fnr zE&}E$@He~efHNM9hHn}_Fo}n~}K57k=Df4c@HYnn7#IGaA z@*Tl_&l14_&jJY>Q&L0s7h;S`0(cQZ%z!n`e=N`7lZl}&y!j1mtkcG?d?64`!ar%@ zPL0kOgx}8YOp{o;e%m${byT{(*C47wuYSy9Wi5Rc(1d5# z?xeNbs{;OntpFKoJ)&RN`;|P@F_P_Jt0ILj_WQByY~`FM9Iw_rr=ny42$>;8RE2=i zvUSE2>co&4aqW7$e{n&^x4*o)G!RN%Rk7DG`yFG5Jzgk|mJvJCkXr2Z6dRF`ZU44) z99`?;uM=4eFxRioPrE~j-n&_1`X?$-?A%@a+>j41k1(&$ zJkIL*!>XAYPd^0>Ma)-(OS^#2Av=?Ze*9{WMAPZbcepv;hSVL-6)1+&>Eu|DO_eW8 zbYJahk+sAhT`T3ggU|0MND?>hqBQ6hoR3?N2=v*|-2Z29iUyc7f$<$CS1WNAu-V_( zy5l`vR(d22vorQW*}IzN=H~>9LD46EGYw=s$LTF>$KooLBLM4x2Igm)MF{@l@gA2| zlIWJK_5;a?@l>O8e!1R}H1}DRm5rn4uGyXZaoFv;`ODO3W848($ED-K%`q)Rz#RLA z;n4vWcnW(CiK!W_JJJ=|RLZF5rQwhg!wq`2x%6bhox3G_7|AHDOd_Q!Ug|7ruXKo?IyyX9z^7jk0d)=|T26JvEb_)+2o8EeMNLUpdY z)(uPwl=p^Mz@%^8%uBj@6Z|SFI&@s-hrfGV@r7*>4rTe*q2A!PLl7Rca2I&+sKwrS z4M-U>S8H(j?F!pufF=>kWT61BR5h-f;d7f-Z@$ZSw{++9>rpBzyrTJUf4NQ5x;B(W z4;R2I-Ke&Cne20O?o&B^eAQ0;tcO1ncnF&sCcROV{ONcs=Cm5C1{HgEKC0A=O>553 znJmND!;}EWxg}_~;}4joebKaBbRV?PT-(@nN5rl?O6HAW1s`w;0;sSwu1Z6U3S4jR z?j|&*ijV(@WEP$zIF$WX^ex^AO>Gu3fW+BHgUp=%hMhmwj4c>Y?Kq}Z`dX&Ft?T?4 z&Y9FGXJ=`WsbfS6NG8)lS};p^A9H)NB_IjwIdf+4yGiSdW7KB0h}|TK48E6-4;T>e zbR2^wkj8FPNAppk{(Pt4EX711&hguXpTFJ2k29C+p(w@cg^v6fH;?(L1?SC!JeQ|` z9d@ww6ip{D$@$`E2osY@yxPuzqE*YyJ56=0c1B8Pmulk{|CbYCp?-mvrLfD363)8K z-P^;|Xb#kYccqA=@p6QH=p*doFXBw&O9e8T9#7BcSI9?Cxjj`v=t)D6+Og zZt(g`N=?=JnO%@|?3@&4Agl&-0Qvflty;Z3<|Z(1Qx(_HC2Z}4e>Dl~(8miJ{ifRR zODW0iv=`53A?j}fe=Ot>I822Ya4q^@0Q{JvbDs2M-<3|y!Oji0o+K#o?}5Tkh;xPa zIJ{sQ3x1zLk`^5@JhOIIm|uBE`j=06;QWKcmAcTb{;Wg})ApUHpW0*oQhz@}`42Fg zwcMlpAjv<~|NjFw5|V%)BE0>G0H>T)@bAZ)D2hlhpLnPi*OK`# zY8yQ8j7ly$k7r0`ZF^9n3g6^+_v~VJZSoNgQWbVBq17Zg)b74(7V$dIm684^?wECg z{qd&nNllY!&^xV1{|y`L+USl@;@bCAFivu-wjRkP2=(h?fC$^=AtN!^0auEI(01>c z(;p6f{xb1?TD7UeoneuQi4QVaW_Y=8Vq*{q!<40^Egz6VwCn|5skRQjx@T!-)@K5_ z-8C$U@fzsxK8Ma#7YhEX7RntT#lY0e5ZdM-i!#!`>8OhY zNTNjuwVZ#|#Z!;Swwua8kLM^fp!fgDTJpgfM^#IHJf;Fa92GNxDS^>Qv`P_uMlHB3 z$^e!Nv-xItIl=>*E=$+>oJ!Wcq0$#Au0w-Iy#p+A%5-gPbzu# z*h6*db^c#7e1uT1!)wGm6=aoiz7BKeyS{0Cgikg3^5gkq#;^J&jz^qMwhsE=b;g(vd+6a^|1W%;m%RnA7m%<^1()WF0KmW-^u_r2 z)m$w7xc%AjOgRpVJ_|0h<;@AO41aM+6E*7<%*3PXcO%FyD;*W0sAG$XJcBF?{g3*X z?b3^}(6G)3mHFd$80;DPSN}a?nJL7G^Z#SSd@UdKyHG+=sGjMTx9N^$cnS8fqv)20 z<1#6inC#tR9f#)ugsBLua(gn(`DNH7&!>k@+tRVKg*U5WC2?SyQsO;*qS)&tx7q$5 zuw`NzwGNjmrd_6tSGjC^*fY|jaklfVrwX{L54%bvt5Y`Et@1I}6tcry{ZCjnGcZ*= z6Gm4WFtyoO{f)(r*>?887DV&9D*;I#><_~XQ*)PeOxrTjafVmVPOartxLwoV%Q*;@ zYmZlBE=#D+;4;O}@UhU4IWN6BMZ=05Vs;xZ5kg%L%`egCq@=(v=PTzyW{raf%S&w7nXgTuMI z_4`W0GqEiD$NF!s>PlGBE?)!UfT>IiN2Zz3z*)bsAte(1icd&YyZ_+_uFxs&pjXXd z?fKVvJ~xiX+oq-=~wzDW{-5 z`m)}z>4szHqwaG1wH4!Ryu@~8-hErdzR!pgpsw*2Pd!Q&I@E>}r0RYWPdL8m>|A5d zFRK@*aWiZpRm#Df>atld;8oa|H?kiWV=_89vu$aJ}7$ z4=h$8!_u7$Kigt)n}%uT^lU=aD0cmk!RFIdp|mx?r0dqtIdUg=2lKgB!Ru+GZ4x&r zuYOBy)TbUiUbllU5wl&4`v_Rn$$S-d_HKQ1aB+BOHPR5`Ab;0-n0sOzl~fqK=X6(H zkVuly_!(Yz)L*i-(b>CZ>-@SNz7F$J;^Viv$bT{uEuSeSV*65um79snb!BW_({Z^K z8%%4xX1Jz^BRxkcMt|}<0#Yct*5xK^o0)0Dx31k^`BR$+cOyO#8ics79fDJA2 zlNq7!d-cs1x`rVm$8pYw5^MNqaF>^w~u8f3h=EL8%y)SO=i(kt1Sah>Sb zd@;Y-^xKlpycS8PmNxN3vRE%7Q9)oo+G7Mv9uQxl9q**oD3A;CIlR;}UpVhHc$4i|drkm#XW?d9#+{lGI3cu+S*VGam{R zo7s&}W=Kz-cpjKGMcOMxQ}SC^nqZIs5#TCfU9QAF}{nB(;>&CLscqfHRCF zWfJcfu5aUatC#eL@yoXxe+iTslQ4CTvCb>xDz_)xerc(#lq_Rs)KQrLo?u_1QP@1o z-tu(R)h5Z1bPQh!nLjQpr_7FC8?0IBQePOZWFl6MBhh!HXZ`&)o=@G`JXkCPi&AR- zww`(G77YJ__3kw64O^dA{kn!>1xzEG5SxQpN@|brJIuwX>?DO63{r_M_|O9BonN2q z3dP@5U)NQPZNH_mJR&T+$R!Es7Ja`k@iH*+SJ8_wB{o8u>7>&uXiq&=cD0s6mdJ52~eHZPC_W+LLb(!aVy9Pz?Y@H@xq2zHEo)$iQskXN>kncZ5! z+f0)Q0|0&r;6$_a+80V!pvj$}%h-%4^_$@7);0>2n~kHec1PD=>MzzrNOS-zAf2-) zzouV~y=P(UHk^@qz8d|iS1ORTJ$ONQ|3yuaP8~COWo~@=q-m74UrbJBjiGKoKR>qs z!q632j7J*OKzfD*@T9wo;zAT4K;2>e)U?nB#g4d9P@~Fn>9^YH@Q$i}wM)TyZa;z3 z3^Wj{-gFm7eXj*J$g;nByX&}gvUxn;D6COcRmnJJ_T$^uLzFSa(&ViZwe!t$-6UWO z0H4s`NGloz4Rc^9Ty#1&>pJr%y28u*+saF7Ju0NXs(5|v3b+~f;i=f0ygu`R*}`xe z^lL9S!?g9UeKfH$|3-J~$^Xi79HDREr%Ag6G%h$2X=RNx)+SQtSKcXDwzA_j(e>~^A!<9iy^YraR)Y*;mJ$7#vF+b`*flYgaCuU~qOV~l>?APN|bM9X^#?JLrVcCqs^D`ARpv{sfqQ-gpc}Xg1829pv z+mvk|AmZGyHqZ*l?1l)*y2LK}ppdn6<6dSHIBh=b)Y{-?I-$PR*=T-8L$O-OxO2Jl zy1+2($LJ)=Pk-NBjiU2esbsI*1sLz?roQG7#&QUl{p@ukwY2H~!>5nXtoKg)u9*hm z)fZrzWR2Y4qWd~))|kVd)JJy82U)?m3S{kPztOl`;@OsHkQqIrX>)Zm4ce}7C08r8UzRcU8o)JSxBEU!9uRIfJXKf+H%Rr#z!Rt#q08iJb{ZR+vGGM4yWT z8)un??M|kYd{yY>b1B(A%Udm`!a}#yxNMIw-z5~jA5`6HQfxSn-(8X$wYfT~e!d|P z=*SX7yU}^pcxm<4Uu_2NiV_&ju?D4A?^;dIAZCqbw#BQRS(2B^7BAcG2(Q!k_|LEh)zuC^B0RC+`?O4i~QpFf8Ej6Lq z41!orwP?|V#!^yhr(;bcqSg-6I7(}XP(>A`MJ1$Tk6ks^^w`B-YluB*iEUD5#>@{h z|G+!%ymRk;_k2G0z4~k!zSQDEJlnEhEE(xa?#LAL8$Ol=Eg2?ED4-F3~yV` zq{jJEG3?0RY*u{UbU~B5=?GD$yxqcZ z%Q#VKq*9{xLUtt)J$L3ktzTg_?5%~p=;UWKmB zM+u85Kucv2CJGmn8#w7m_?L-v5@okjJlThzW{IY9YsqcMeRr!U`l$=VGeCLwze;GN zpqwDsXNKs!! zA(MqheXB$6madI4>Ex~7r$vgZA)PWddN$h;5wHwROeEV{jrwe7V;#PTo(Vf`tKaPFvPlBaM8>@q8A?ZT{HNN%=s3tt|zhZr<5uz$#C}8(iu@<%Vss%6Awsx*| z^yb(TV^z^u$zH9BJn-0VrsKt!);FYri%Htq?KWO#x2-fx#F5}H(pqnJe6}pMs!#*d z{3lb_Bo*Lkm*iJvnQBPN}s{=>7(kOJl%L=p7z_FF^Q{ zRE@;3+c?|_1%|c$2osKO01|fcT|NqKbhQ9F*}3P3J|jWq(F|`=hykgiGQ^>>ahWTs zA5z0S2x;c!?Axlt=B?-Q1%*fiv~{{!I8~47gWsmqUcay{J^W zqrc9H?fK<2JtE-injcb0NJS3IJI7 z{{u?<-YpQYvlyM?VJRY6r)H}`ZI_q)-~GKlc)l-OcIMRTUEk$t#PPnkw)tRDH2@em zAa47Ha1~&|aO7xjL~fthC#RkImodh$yzdcXs=3fHh} zs}1Jm23NCC5l~lnC>0+b@VY~*2(3E`lsO%0#RC|4=oOiO05JU3n*7Np55VA|SuEmF s0{lRSYSCdI5*|v;y8qe$ZBTH1kH^CeakV&Xe&2@QFo0bn>N`aI0Wi5uqyPW_ literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 75a0ebf..695605d 100644 --- a/README.md +++ b/README.md @@ -8,3 +8,176 @@ [![Tech debt](https://img.shields.io/sonar/tech_debt/com.javiersc.kotlin.kopy?label=Tech%20debt&logo=SonarCloud&logoColor=white&server=https%3A%2F%2Fsonarcloud.io)](https://sonarcloud.io/dashboard?id=com.javiersc.kotlin.kopy) # Kopy + +## Usage + +### IntelliJ IDEA or Android Studio configuration + +#### Enable K2 compiler in the IDE settings: + +``` +File > Settings > Language & Frameworks > Kotlin > Enable K2 mode +``` + +You need to restart the IDE to do the next step. + +k2 + +#### Allow third party K2 plugins: + +Popup the quick search with `shift + shift` and type `Registry...`, then search for: + +``` +kotlin.k2.only.bundled.compiler.plugins.enabled +``` + +And uncheck it. + +registry + +### Download + +Apply the plugin and add the next dependencies: + +```kotlin +plugins { + id("com.javiersc.kotlin.kopy") version $version +} + +dependencies { + implementation("org.jetbrains.kotlinx:atomicfu:$version") + implementation("com.javiersc.kotlin:kopy-runtime:$version") +} +``` + +### Example + +```kotlin +import com.javiersc.kotlin.kopy.Kopy + +fun main() { + val house = House( + squareMeters = 100, + kitchen = Kitchen( + cat = Cat( + name = "Garfield", + age = 5, + numbers = listOf(1, 2, 3), + ), + squareMeters = 10, + ), + ) + val house2: House = house.copy { + squareMeters = 200 + kitchen.cat.name = "Felix" + kitchen.cat.age = 7 + kitchen.cat.numbers.updateEach { it + 1 } + kitchen.squareMeters = 20 + } + + // House(squareMeters=200, kitchen=Kitchen(cat=Cat(name=Felix, age=7, numbers=[2, 3, 4]), squareMeters=20)) + println(house2) +} + +@Kopy +data class House(val squareMeters: Int, val kitchen: Kitchen) + +@Kopy +data class Kitchen(val cat: Cat, val squareMeters: Int) + +@Kopy +data class Cat(val name: String, val age: Int) +``` + +## Features + +### `copy` or `invoke` + +`copy` and `invoke` creates a new instance of your data class with the content you specify. There is +no difference between both functions. + +### `set` or `=` + +`set` and `=` do the same, assigning a value. + +```kotlin +val house2: House = house.copy { + kitchen.cat.name = "Felix" +} + +val house3: House = house.copy { + kitchen.cat.name.set("Felix") +} +``` + +### `update` + +`update` is a lambda which allows updating the value of the property while having access to the +current value. + +```kotlin +val house2: House = house.copy { + kitchen.cat.name.update { name -> "$name Jr." } +} +``` + +### `update` + +`update` is a lambda that allows updating the value of the property while having access to the +current value. + +```kotlin +val house2: House = house.copy { + kitchen.cat.name.update { name -> "$name Jr." } +} +``` + +### `updateEach` + +`updateEach` is a lambda that allows updating the values of an `Iterable` while having access to the +current value of each element. + +```kotlin +val house2: House = house.copy { + kitchen.cat.numbers.updateEach { it + 1 } +} +``` + +## How it works + +The plugin transform the lambda into what you would do manually with `copy` functions, that means +the `copy` or `invoke` lambda can only work if the plugin is applied on the project it is being +called. + +There is no reflection or mutability, your class will have some new functions and properties added, +as it will extend under the hood the `Kopyable` interface. + +The number is limited to 9 independently of the number of properties your data class has: + +- `copy` function +- `invoke` function +- `_initKopyable` function +- `_atomic` property +- `getKopyableReference` function +- `setKopyableReference` function +- `set` function +- `update` function +- `updateEach` function + +When the Context Parameters feature is available, the `Kopyable` interface will not be necessary and +the number of properties or method added to your data class will be reduced to only 2: + +- `copy` function +- `invoke` function + +A new `KopyableScope` will be created, and it will be used to store the rest of properties, and it +will be added as context parameter to the `copy` and `invoke` lambdas: + +```kotlin +data class House(val squareMeters: Int, val kitchen: Kitchen) { + + fun copy(block: KopyableScope.() -> Unit): T = ... + + fun invoke(block: KopyableScope.() -> Unit): T = ... +} +```