From 89f84666bc000ebb5e3f5b117b18528736424d81 Mon Sep 17 00:00:00 2001 From: cpu Date: Wed, 13 Dec 2023 01:53:14 +0100 Subject: [PATCH] added unit test, updated Readme and picture --- .gitignore | 1 + README.md | 111 ++++++++++- assets/kukuc-clock-schema.png | Bin 0 -> 22418 bytes kukuc-clock.py | 22 ++- dummygpio.py => lib/dummygpio.py | 2 +- .../slovak_datetime_formatter.py | 134 ++++++++------ tests/test_data.csv | 175 ++++++++++++++++++ tests/test_slovak_datetime_formatter.py | 34 ++++ 8 files changed, 406 insertions(+), 73 deletions(-) create mode 100644 .gitignore create mode 100644 assets/kukuc-clock-schema.png rename dummygpio.py => lib/dummygpio.py (91%) rename slovak_datetime_formatter.py => lib/slovak_datetime_formatter.py (52%) create mode 100644 tests/test_data.csv create mode 100644 tests/test_slovak_datetime_formatter.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bee8a64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__ diff --git a/README.md b/README.md index 4dcab25..b406b2b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,110 @@ -# kukuc-clock +Speak the current time and date in the Slovak language on a button press event -Speak the current time and date in the Slovak language on a button press event \ No newline at end of file +Hardware +-------- +- [Raspberry Pi Zero W](https://hackerboards.com/board/raspberry-pi-foundation-raspberry-pi-zero-w-wireless) + +- A button connected to the Raspberry pi GPIO as shown in the schema to debounce noisy contacts +![kukuc-clock-schema](assets/kukuc-clock-schema.png) + +- USB speaker with a microphone e.g. [Jabra Speak 410](https://www.jabra.com/_/media/Jabra_VXi_Product-Documentation/Jabra-SPEAK-410-Series/technical-specifications/RevB/Jabra-Speak-410-Techsheet-A4-290420-Web.pdf) +- microSD card 8GB + +- USB type-A to microUSB cable + +- USB power supply 5V 500mA + +Operating system +---------------- +Install [Raspberry Pi Imager](https://www.raspberrypi.com/news/raspberry-pi-imager-imaging-utility/) into your notebook. Launch it and choose `Raspberry Pi OS Lite` to write into the microSD card + +Power on the `Raspberry Pi` and finish the installation process. Log into its console using either: +- wifi (from your notebook: `ssh pi@raspberrypi`) +- connected USB keyboard and HDMI monitor +- serial port using [USB to TTL Serial Cable](https://learn.adafruit.com/raspberry-pi-zero-creation/give-it-life) + +Prerequisites +------------ +Once you are logged into the `Raspberry pi` console update your system +> `sudo apt update` +`sudo apt upgrade` + +Install `git`. It will be used to download the `kukuc-clock` +> `sudo apt install -y git` + +How to install +-------------- + +Clone the `kukuc-clock` source code into your home directory +> `cd` +`git clone https://gitea.virtonline.eu/2HoursProject/kukuc-clock.git --depth 1` + +Go into the newly created directory +> `cd ~/kukuc-clock` + +Configuration +------------- + +Check your Raspberry pi board pin layout and make sure your button matches with the GPIO pin `PIN = 27` from `kukuc-clock.py` +> `pinout` + +Use `raspi-config` `"System Options -> Audio"` to generate the ALSA config file +> `sudo raspi-config` + +Alternatively check your sound card +> `aplay -l` + +Put your sound card number `"card 0"` or `"card 1"` into the ALSA config file +> `nano .asoundrc` + +Install the ALSA config file +> `mv .asoundrc ~/` + +Test it first with emulated GPIO. It will simulate button press and hold for 8 seconds +> `python3 kukuc-clock.py test` + +Run it! +------- + +Just run `python3 kukuc-clock.py` then press and hold the button for at least 5 seconds +> `python3 kukuc-clock.py` + +Pres `Ctrl+c` to exit + +Make it a service to automaticaly start and run in the backgroud +------------------------------------------------------ + +If your `$HOME` directory is other then `/home/pi` then modify the systemd service file +> `sed -i "s#/home/pi#$HOME#g" kukuc-clock.py.service` + +If your username and group is other then `pi` and `pi` then also run +> `sed -i "s#User=pi#User=$USER#" kukuc-clock.service` +`sed -i "s#Group=pi#Group=$(id -gn)#" kukuc-clock.service` + +Install the systemd service files +> `sudo mv kukuc-clock.service /etc/systemd/system/` + +Reload systemd manager configuration +> `systemctl daemon-reload` + +Enable the `kukuc-clock` service at boot time and also run it +> `systemctl enable --now kukuc-clock` + +If it does not work check logs +> `journalctl -f -u kukuc-clock` + +Set volume for playback and recording +------------------------------------- + +Launch soundcard mixer +> `alsamixer` + +Press F6 to select a soundcard. Find your USB sound device in the list e.g. `Jabra Speak 410 USB`. Press F4 and use up/down arrow keys to set recording volume and repeat also for the playback (F3). Make sure it is not muted. Press (m) to toggle mute. Press ESC to exit. + +To preserve audio setting after the boot run +> `sudo alsactl store` + +Run unit tests +-------------- +> `cd test` +`python3 -m unittest test_slovak_datetime_formatter` \ No newline at end of file diff --git a/assets/kukuc-clock-schema.png b/assets/kukuc-clock-schema.png new file mode 100644 index 0000000000000000000000000000000000000000..a48a422aa8d6f5ac7e2a98913c539fcc71c7679b GIT binary patch literal 22418 zcmcfp1yEd3w>64(65J&r!6gKDcY+h#f&_PWcLE_egaE-kSkT~3a0nh;f?Kf0UGD1S zJLjJNf3IHEtGfT~qKcx~z4u;guQlhGV~p8hN(xfwCXY+>&L zebOcb4q|{EB<5sl=wfMaN2X?JYYKVmlEuo#lx1RSY-(#{>XgOC!p6>!#m36V%FV~l zcKdUl2?8O5yb%{s^GMtK?XIahO^A4CFWNy8o)bucQtwD6yWkCdt1cx{4WU;Za5C}6fGrN=u2T@491JP=SV<>7bIn#gt5z){?&N$YD{rC0kB^8f2>}A54 zw2TFND|XT#Q0(tp>OsgDe-F|^|37e$iL$ctW^_Bv(a{kE5+-i6DINZC4eNQdm<|ty z;|fn#@PGfoI?ZEZRnsVLuc^koT2ozLoEA3C`c0w)RQu*F>T?#h9F~?A2$*(oRkRdlk3Ch5UW1 z1Ob=m?>m(Qat{Ch9Mm^R3;}bitSlku8F&{Gy}ZyZTkj2hw2F(9rCuC<*9vYwz!b`Z z=|E&;Y`IoZQzHS7i8)cW5;M9?R&D+JSIN=8n~6B%VMA#vy+)mPJK%Ds5zkXMGsF8F zr|Lkx%2c~I6MQB6#mM2I)nbxif#JVCQf+#pFqqMXgp&7bAsb7X${ck34)O4F%mTHf=*mIE1?OI2JvKCy1`Mbu#h zmdN~ERI2Ry;(w0a))`nG(z5FFugdFl9lDe>=q(fUxe z#f%c&vpX5go4A z9r~O3+?(z18XFrJ9+osx`Mjw~m(T$wlU-6={Nv#_wKon#nV*#QE=>OJ(VPO6BDh{I zu7$OaeK-~m+LQNnIz;~m_VK4=eh6%tS2AIe2#K1hf7z^$OeF+Qj@?+?q@?NMKrA`E zl$UAi0OO+4bnr#&%HMlXE=u_FC0Z&rR$4|zRK|+HX2Yqzo+sBTfzH9%nX^7~Plpul zgd$d&EPP3&WwY7t8 zSf>)Kr&;Y*y_Je4Ax=j3o+~;Y@yv)d@6Z#bl1^FAtxZG0MMGm0UmL05Owe%>r4uR7 zj^ifKsk3ZfH!m8CE#W4}z@MFzzp+y(dWsW9xpcGG;!irp`n_*(FfcCnu_?OE+CAgets+-k-xIN)MVaD8ki~3n+5%}g790LDY0{C@|j=jB-TVBd86A-0Gpki z*T|jQ!DE}nTCq_#kLf9&8%0^!-bVRU$K^w1oi`06k`f`p|V)+ zYJE()aPAU)yo(Uwt8{#ogxxHI@*UVwJw zjNAu#QgK5*CB=VWvg^Ux4rXSyMfXg@{2)dzfZSt?)8vazwVx{u-9)*hEroK+e0D_&Zi>rfVa zec`G*Fp?EeGh1^Vzv?uTI<1bY%W5Y^WgIR=g)Dhrq|}uax!e&w}_ae zD{IO61Pg7f?>Oy0Hr7~MMmsOAz3p~lR$cuUdcA}nuKC^ef0vKz6&b--+e|&>y!BaG zU5&i_Aimslj6VvetTwVZMDd%GwDZ&|4b@^^*sw~*c)e3d4vZ@N3@Ocb)Sbuyx zbnkm*I8ZUg(1rDLd(THwTs2$VS{A?8*o_gvPP)Dx+V#~$r@;&T27?5TQgn89_R?-q z)I+@_%e^Q*yY^s)Hi_2J)lnpdDIKNxAi>XfSvRjTOFmD9TuA7VhW)~iqH%Nhu#LEa zkqWONuNK)nHufqO-=0K|n;fts zzA$xuMP5URB!*DrW-Pmj!`=FxwYj4NKc-g5w|!_l@w^UyhcN2D>%0(?4VAlRn>eqWY_hB)YnKM2~!CXWxrSoya*TWb!j>nyGgW z$e!p#2=Ti?afzmj-r_F#^5Xv53P!S;I+RLJ;bgTLObs**Ef`K4r{sC$x=WU2cRvFE zh<5}J-T%&%Vrz3JTm!L%f~UarB>#{`U!jUaK3mCP;5^;K_3+2z8}8>!$}d3#Dz06H zPV!9_>yh#jF(J?UsD9x&!fLyD}{Z zWP2f7H~ae6RE`#p0KNLtYReG^2=Blhcq|MSaRVDk4?`tB5fC^on}BZTwjdp*>1q%e z_JrdvsyM9*$13~+HhJ2%956`ylBLxTX=1{k2^^HHg9d1ix1Z2dX)`8O|(_vWuw zrYZBWMtXeC?sVFn+K$R&eif0>BuI~b*CiC0j~4WfYSnnNiUvdYTBYmpPl&HBSG+iamsc*%Qfm#i>F=V#pFpCC_{n+BOVp74CX4ZZE9wyu2Up2l(~S`G zJL0_Q?+>hff{}DY zi1dN?#R2+N8UOVuB_(C+USuw; zG(FuhuZ`Pw{=KUCuw^vi6z1z`1>)0;c>w{U;`=K_XCLVO6LCS$&-O)D&i^$VsEJIw zPZ73fORL(wOJ?S0S4z1hUo!CYt>5@d=XD$pHkf0fIj;PAmi|*mu*vQH;13>p505NQ zkEATdojHA%^f*u)!5($&SFkdFHrv&?|B@{n4)^fP~hY4g)i z!z5N;f=1VaBv`&k#!t4u!C|l%=ZFXP0V8H_*xIU5b36w73jOnDw z^Co)OSyJe23+moQ@Jv0=ZG}tnrY2RK;mmO%`qC_D(VT>=43tto03z9li61n0Gx&Gzo>9 zs&6Y6_I?=twz6s{E_jot@&OJWuVJBHw5V(EDgw@yi;K%*yt1L)7vOjC3XW3!auQD= z`_ml%{l_o3?RM_xaZvxWFB1yQA8<3jdHR2%r=@?;iz*oTaMQ4zn$V}{(|q7ebLA^N zDYbOWxWD5F?}(m0N0n8imPBhB@O8 z3MP8{^$>4rxn7eaF38e>uS`RtTjd-G;3mci>sUc9Vl|%PuJ_VSS~%aGd;+$ZUoCYV zh;2w2%ubGOJ$;5jsLjJmBhR;(b*G4=ECiijQTf?Msmy*ysGU$f-1)yQ`GRf%|f)CxGhM@6A~x$b_p&z!5y6{@z9W{WVz}}-6VA310iA{B z=oeG;;c2oRt=;#3g}=Hi1$J2vvxVnq5xY4&=Kb!PUaj1F>;KSmXGrY)~ zf9dsto~D94Ej|6y=g(COyFXT5g4_3Y9?7BP8Obqb*;pHKkukWrxi%Ws(0`$0V6Ypl z8@QFMla@YKAmtuZ#;C8LxtCQq2^WF;xALxhSH{$_Bv-6P_ccE+q0jyTojk6e#p{v< zZF_uR+xoXo@P^M@x@RgXDl2vqGnh z1=qO)@db&X057kR^1Y4VcbvEIwzNe>fx2t*?UUW`r77GJ4~v2;1zVjhx zB_*FKht_*577WdpYdn1ijru;hY&Cf};+{KFM$B(uu(bH%X4nM0AbnaHb%(u~M`weI zoLdRZTTC+%TkV}vpxWZ|?n`>Ni#NoH94(XAQN+H5HB<3EYg?pva|mVfBKhPw%l>#W z-y4%U1>(c|E@VmHQcP0*_W(OuM!&*A_Hx;^IXt^I3#+VrDoM@r=g%LSgIlrumZOB3 zmeA>6t5ZGylc`d9*Q-2pG*zssU9i8NT;)l{gWD55X36ie{zB;X7B%-^KF`?OWq(Gm z;P==V_Qt|MM~jVCt{LxXk$!oZ!u*k{d8CYk-rm}Apg4s{`a903@J>l>?GWUQlH=yn02wcAQ|1go+#( z6(!&PT;Mt0!i)3s^OW`7!7EfHnx}znRi*DJ6ZX+H?t!RBWYOTV_S1NF0Zwo&0BpEkoUpF# zSw4t^g9FVuR9_`b{ITqnB3*)2e&rA`YHzz^=)N!@>mC5VcOA2aHSHfvEM*AtZ#JkT z18b9JG#Rds%!6)}QkF$-SIH9lN2`h*!jyePA8+0r8o!@5GdEw`4J_|rH(n) zTM43mRilIVE=l^?a)aqIN8~Ih`)sD7b-0y#-hF>8Iq%ojR65da1K-wFe0{yg?HQE7 zr_JGeJE${`oRH^odt-Tg_C735qs0Oq;}82iwe;sSBI2XYG<(#91qg4|r#W_(6~k=F zvuxdu^ON0qqYq3GciwW@IRH^oRAPzg{VA_nx47FZy|lZhXx|H|jU1FKS!#Z^G_0$% zK#n(;b?>{fOqNzU+vxlp6svj}#u19rKSDBn-@_QBIp5-|EY+r3$=+pUg$u2$?d=!2 zH~l01ASip+L3j!MHkqo)Vx8i{e}}(Aj%}Wi{Y>p9u&=GHnnOzhrPy z(i=IkH6m}VM1*m{RO@T|QI5uvhGQx#B|{&Fv>lg6v8%1d&|Iyi0#b|Vf3f|-#>I`G zpSD}xyF&Fcr)Vx#qb(XmRcqDZl}i=C&h)*i$?^rTo5yJnZm!xUI)(FgW$#}V*Xo6i z7(+Dq#&2(b@9+o_N_e){j|y-lIUs4OL_mr1t0}Bd2plrrWcgJlPgF&PjY+rVBm36y zu0UP3pf@}uoxi#>c8wYiSzb~SLFmc|4^|wUP#GQ`m%stsB;bn|gj=A9nlbO0Z9j5g zp(gwz>+*e?sRnt}6UX&SWRWKKgr5lh!~tm?NDZ0nkDb0iNCX{Gq!iQW4zG*i7RR*J zR_2CM1C85uCefn*1m9qOV7GYN(tQGbP53Vfc?Dfxh)l#$YgQS?WeJkAViR)NcOyKx zv7ByvC6vT5cKQfUq-l!r=yaAHuoT5)$kKpaXq4ARX=K-6Hrc@-)z1lZm!55 z4%c%>Mi;q8nDHS;e;*iU(rL}9;#LM|n9F|NaP&--N&!;+Sq*^Zn~R8yw1w8(Cd3#` z$1nl_{}WK+s3JQNvG*kh5EY`YzF&x^J$!~PU^t8zN?ei{L!x}+EM8pa9 z3chq+=?Oe_Y2jnf^KDa;2Ep(Di`W5@JV+`Q<28w!noNntOX_QhT$TfUgW@2XQ@)~p z$;gTB)Iel9(3o9WP%zwi^M#6?9W_>28LSD>cklT2_V<{?=OeM{zywF}y zc+}qq_2Z7^%2LNI7SQ0teLiI1Ljc5A-_M^gx|7b^Gp9L&0-2J-@n;B+^L^lEz3NTv zaXrbr7Jt;_r7S;RIOzD~ zF1N$cae_}7ne5?3iff>`ht>5>w&TlA?(cxsri*>*fBjE&5m%&&YwzCJ2pR*lj|Ty< zZBMAQHfQEHKFrC7;~N=v39)=IJ_7Ap=+o*JE}KwgUjff+H3yyANbT4)I;4L)7HQJ= z!$9e6GDEk4_TjQ0DN({UH=1afc56jv@jfD78g=s2;NXf)Xo~n?SaN%!BK@V z3jaq9fa7|~6fxUs9g|Fv-K=(W+yS%+INKAyOYG!iEl(X0BiH-YS9>!p8qN%H{fCSE z_V|;%zi%)dRwwX9QdtQL@$e$hfZ!G@VevZ$-%tN6ar5%D;bi8!H#1+2y>(BaG>pE( zex4Z+8Hpx857;NH1)kAJ<=F4T`puCTw%XRwgp-&7`e#;>XWwrzS8%!m8eNr!3any{ z>HlktfGQiS)Z)P);mxdo+TUNX0cHC2uKFp#_{5L z5dc1>H(fZKULwO1BCG`$XCB{kqJT8S z99x@urQkx!bq(>3;VC?J;VZ1gw{(e`0{_JkY8OdG-hNp0?)D}j>7AO|Q^=3;@$tdfr%`!PVoZr*bO}lP zX#bQ}lQCH7r(Y3$;2)A%nH?p@lsE5e}bbehMhc91Qrp z@#}a4@MNRQJxG}7B5|Vz^^NsO{FFIH-G5b1hG>A11L%bTI!xTKkM)9& z>6w{*X%NdY>L5K8&y%vGrGo*;LPKA9l{LT(H;7SG^8B4c>C=*i!q@OI#}>x|*~pd) zNC50_VubbOu>K8O%2l;Fj{$#y1Q5A=rzqg2-~hLk42D+R0T&|ktU)JwfA^l#{e>Fb ze&Yp~JCe9sU`bx#>sdBa7>~75WMc04UtWN0awK#+G;?Zd=MZs|nxti=B4hAG53mY9 zJw*v_5F^XMG3l3p|B8cbHT^A&D!Uyduy9c7F}6a`V)OnL>p8|@67Zlp#>T_>a5#zu z6wHsQsl{M4U^V?+$u=0!V`u*}9BgOhM^aLVaEJ&L z0t|3qM4yslA3+X}kJ+3}#7`gp-2gb~ta#53kIp4MG!@g&u!zlbH4Ucg;FW`sj3l;E)&+k;lkB z-@IOe`@QozH@MPfEBZ`Fx2)Vsl=5MH@Ye?pj1NIUV&9kILS;x`_m4AE=}QeXkQbn$ z4?MT#wp#_V?xp#VSM$TLHrTi|TB|R2RnovrtI+OD7DeS7W+P#uerzkZ|Gp3s+7%27 zN0v5owNI7?lQW^bMMXtPN0W7sACw{Cl&rMKq<;5#Zz51Y$Qie(#mB>edv0zXcP20X zL(rRWl!`~q;HMv!S_gf)^UmCy`U3)|pB@<*oaw@X z9Ed(zY*ajEheK&sGnK~AK}lf3#r0`!CW-&6sB)27iYYwr+NTs=3Od`TDDZQxP}>8R zQx((VET0U9J`*=jwMS`mEx{UciO`0Y%0j(VH>NP98P7XJBP2 zPhZ|#Q!spG?dTL8EA)HKDj_L8^&0QlGt+|?kvOEJm_I7pzS}Rhs-8TN$yR%8wm3TY z)TzhtfTob+=OD+unCBbz^Psd>;Ff^i%HjUPBzVupR=G`2m%|Dx;8V|g2WD-_lawT( zCe6+*oPaef!suKJ6J{X`?eOPE@7^si(W>-hw-?4giRTzc$RqHWWSH@qw zWS-){Xwbm`4jtzZ6^p6E1~|a+d|ad9!^6jV1n|Feh>`^Wcp$b@53@?=eYuHxkM?q^ z%^PB1P49p2f7Fwt{U9V5CF8KphJSr_V9C1XeRTIzWpyZ`CMqbjZ=y?o3S?rL4>5Jz zRMDi?hgWe+o~X|Rem*yb)p0#*Fv8ywkYlJ27XPDP0wb|9c^**UwHV7&eG@DJd_XL) z?Mw-SwjU4>4Tr9yG@Bf&@^vXyzQMsUc&~_{Q(&xfet0OV}TszSW;&FCqROd`~NoK zID`>swFst8Klf1hPo}M^@1#{HLWI>jZgLKN-}*P4f`+SVhImJYhiiE{Y2E(wzkj$# zT>Ss6`{{4o`+v`D_5bT~$qi3v_9v`rK*GTWdZ$v68bUff%$0$6=Z;HPL$ITB5igzh zNrqD5AQ5KxN&BD9EhnLMEs8u9TAtzI;g5MOhz(lTH%EaDy^e?5tPHn~$?aS7b3a#B z_aeV7zEx_o(*?3H9B>^VM2P|2dE~vA=G8@;w7l$ib)D_x<2A_`hCM8~p9|2CBF$@_ z>NfqNNh`lLoJard;Of=^rmZ=&jtCD%#)Idl-L^%>j~E{AJlYr5Sk7Cuv{1Twx?gfJ zk!&&PbO>8d8#_D*S>P=2EZt`aMfAiB_;)5)bIajKIkH~d7}9+a!T=|y{$Eb+>E-oh z8$Cj_6u42;#VBHbd|n*}iXl>To=Q=7bT`2w=4+xg8r6Kc*s_tq!7lsadr442BAoxp zW5)nu=_I)3ER_CJa&lfBrj(SFa&wH4hp=2bK~MJG-OtaxM(9w)AC95u|NMAK&O~go zDc7H+DN|^fWW)Kn_v^uBBx1UMEx|4`>b?Z58|}G1p6PC;Zd^u2#*POa5?{Z5MbXo4 zazq7+Waq$u>^Lw+u=xFY3JPP@aWiA%Cjfy&Mn*nfqp|$2OEcTal0@XSk^YTte?5Ul z!;TewkXUKp^mqd7TI*L{fH^T6%7|z|!~h~O-LrF2zDTNU@|0S@jEXn`J&92+{gkUU zy$MUBd{_S)tTZqw0;@`k2GrL+my1n6)}RCi1Cadwhr_LGl9Mr~jJUJ(pp9fs5Xe!>2@??|Dn-FQ(r}!9fZOz#5 zo#oil)abfzaH(IX(6g%3JiRnKcsz^%n?is*V!Mm9oA4Ul_Zcjj9R9FP*)LkfbbY4`K|Ncz*#ltlXbR>fNbmRo3}-3fp?_mGg6K^~?aUt~U&V+Nn@fZJ*iyusYA)@|{7 zqEWu|`uAMTAT0TXjYVnK9nB`{uZ^wsJs$BT!VgaHFYoc+%pI#Uzwj9mc0Lej z&8UJXD`q6o=}_dTgdh()1NWBKJP_AqcyIthF7E7&UaMkmlLSSQ^0cXmnbB}Zw+9|^ z5Vus!gs0%ESI;8+-hCXJcT1vD0w;(>RzL>ut=?^o3a}9j79fT8wC!?%LQZhv@FFOF zw>T_R{14EK08n=4>yJuLXN0+iK0Z2IJ~)VukAEr<9@#N0c;jMbq<-H*P-8vy8mLMf zwigG&Ke~!Y$+?&m#y9u&KE%gQtP*2k$0isBsty93jLT**T=@Q$5V+9z%7NxLsNeh) zqSW5`q`ZX>PM5!SdUpOpXz1W>Y6I%045qaGa{Y29u&_R&kZiaPlM4FKOxex_UPUB| z=BZfDJ!jAg-&`^L)bHd6C+u^o`Dp>BcNj~>yj~)I8E#1_E?nU`1hbOu4tiY12`b5IjMupho{DKd*Pke zSwK*bpqcMQrGdPSjsTNhYdG*!APtwR%%TET_O+71OA}N4I=JZ2P(3hAIT9(!mC}Ay zY+OR?(;D!oe-t`GmqU1$cJ4~aKyWMpY|3_Z%iZQKu%tD({uw0!@|xI{(*YpeX^2%y$m)^6e3TW2er zure_-T~X)~B;xm!saS$h*-6Jo=D?mCEh79nEVS@aXCkGAcIzOz;*&v8S%Ng>rPpSG zXX_%UXyrxGcOybWQF`DCUcgMnF%-cYV!PADL6}r+5ms+o9&I1+_^(ab`dsZ_gx0(3 zI}fFYHo@%1hl}%TvNTQ<6uX)*sTILjA2g;1~SYE7e86gh#fs9&LSEx-lPCD5nB@&SzL z!@b#EstH{Csh5$&VMs)YaGMX*CZnAuXqHcdQwkSgvL>ykQUw%1T9H$c30KfQFt-44 zUI)baPk^CX$?fF?niU+o@cn3^xdjldS!|ERMdn+BLgevYVq@d?N`AY^RmuCwB?eZD z2@(|#l?$|83@Fi-(Z0nRV&G;aFUG+fk!uL64$-Zuh5Z0u+0#Ssw-+Lakv#9-?o z;^DJo7mQ>eN7KhM`-E+wkdTB%dnQi+)q+v8QBv(i48_aXjErnvH{fRjmNc_Skcf12 zbPcSn>1R?m5AG1bJE5V+op8M$fO{OS*Uqji_@Fp4HFcQ>7?wtTWB&mEP@(g_9L9S5 zBknKnO7Zp_?9js0tX!TIFt?=#$!e5Y0k^VE%pX;%=R5bFZ{EmvcS^;?rhN{qu6E&> zneXiG#@EY8aJkpR)p`tw{>B=sRi84IF^w`kDRp%`U`|EfSySlJrHPlBDAUTV@1Uf} z*@8`BL|oPKC5QsS2fHh4y@7z-C=k7n$Ug(@b9uC+0zcR1; z1x2q^{?YH|V7`8N%Y@|QU{e39XVz2p6STR-ih!pF_D}d-E?bcsu2R;keMhfM`wE0A zvytv8;-*33k8gnV>T|v^y@`?AR|Zbfj~h9!Um`WFaJg3Q5BFv%X24G(ZrPx|X)E(b z*;4b{I3fw)dy>|9&ZI4aF z&&QV~W4h+QCY@hre4z*S^v?yuP*Eotl*Ke2{D-o610|9&1Z{h3(=vY-cevyQ_xdcfCW{gDK(WI;q;HG z3mRDWFNVRh1|eQFkZ^7LC@!T|LYPqu_)-v|$(X~%^-OZgi~_dud~5X zJFiTh9sW+!1<5j?pF@51-m)L}t6r*=(iJwo5f_(pkh256=Ri1WR#xPbM22oDs3M(1 zl_C(?pm+>mQ8s4zf||J-haTS?q*G}b1q6s%@lMo-E=o#DD!if*z}RCc)hWE+5{!s$ zKb-EhjQ*{od$g0K5$*!bfw`=h^joMbs=j}3uV>9=sjz2mLB858NALZz&wq5+(G7H> zl=I$LWnjq8^tc(Cju1Tf%wc?uc)4+rAT28k44Xj>owU_p69eNMA~NOSNhyZ6cjv_! zPU`8YOFa+2@!s|{ifc<%9Bym!75?JQHZBM{rIs2+lRW>RnXUopT2G{C>X#vSTYh(F z_efhQ&EXsjVEk;;K%HC6TEaPKnPj|Izpg|qBY+Z zy~>*$cez^c{W6B_yS&|YjZTAhO}v108oRl`KF0eAsqei+*zX5mXs39^`PNwgfHsM5 zzYl+7%(2zco<)B-dK9r(c$*&sP{3?1*Qpr#Nnu^seO*S8QQI_ zxotWMSHw!K+&!Q_6OMZNG#+IsVb(;vF)mQ~SN1*06^FOkES4(r+5*FIW0`g@$&_q|=x^xA6PAhTdU`+?BQAZZD3`9UUURl$H z2ljDb`R(qn+H$zuc1-`N3IrEc$Ay{C7@5_;m%V%w9KqSUKVL1X>45cAE8M4yEnR-z zZFwTuIb{v7sG~J;h6$-CYaw|9a0!*L?BcuQowB|OR0aUO80+(4<~!yZ>+wq7j=&&? z)l+==RN$cNA2+{TiD3{0jPl|BgHSIJ&MMs2%+h$>^(yRVQ9-@}gmkWN>X+^Ds;0NE z4#mZdV7ZxxpV#m_k^N|Dy(l!y_ezYJpPvxso*sl-&r|6}x!jBxF*G-yAwgC10Sx}P z*^s`Wp=Z$6Gb+f_opvwd?w;-yaHAZ(00RTqLgUb2Y*;#9kN;4jRlr+YQ`61OE*xaf zNh+V(x@8wBUk`d4$fO-0%RQz1fNjZ{DAh#;#;C^-pq)qp81(tG)0gj!^*o&g-|9r( z3<0SN23Ufi){N{{fZ+)Sz^iC)BWyz!&*)e6pL$%!=|XE5sIY(F7CXeEOYRL*HLnoV zc-8#IK8k*9h;EDN9ffAfRJjHwP!--WT=2OaKi#}P%mw{3vCAhh`8kGnkao|bqsG+X z*2_=kg^e|?q{ma!%&~ce%Pa3e&IL+XXy^~P0?md*#vs_*049f{Ui}9Pvq#4&-vbf# z2)W>N`D#Oe2?$x@jprNCqEUB(XA!N%xwL}ot%maVK_RU7P0x_2l;~cp_237`gZ8yr{%{F zOn9e$77v0kF)_VOs=_z|WW;zxAIga5H$0iS1(Aol2NKEOuZ&RsnJ4_3=B+g(Sb7Fc z$XorNE;v{>;9Npe*MUTHel&mEefXNSnhqd4rg)-D7~sD!+{lmP%~S}z<3eS2h_tGi zqtpkTK~d=1b*OWof98p|H-C^(-`ztXk+7>|!9H;B{~8}Rw6`z6Ab8lBT;5&|sMcW@ zG9S?w5At$FZ={B#@%oE6FvLn@DHVKCxScw^`1$#N=|4=eCSp@m9KmTZRBpb6&;pWq zr+$C$)Lw7v;K1(K``H$c%;%cuwUA7|_Bitq$ogQKkHDF4(D@LJerxlaR*aBn5-F33 zfms1i@QOUSX|FQs_9e zqYrW#B7f~cUhhVkztvHt3+Ec{A6v5}unYX$~K-bhr>n#Cr zuD$?*H;keHJsmIWhezu8^4o-w!RVeZ1;EG1CYVJt+NkTU|&vBxUxlW z;SG3&zjZ=-dfM^+3Cs<(_F1p-Y%^)vVfhdnR6LLRXpt&FPZF@Rr);LZ8u;>(UN)Pz z_IoTvg@|vT2^VO{%E`Zzc(cP$y5R*ffvEJ_>%E00(s{Ri>}D>YkvwjLQDWj(Kp>{X z0krc4R2ZxJ?OB;h4lC?QDtCq$0a3+z?tD);6o7Ry1|B3xg;}Q=uxmcOCV>^oAQ7In za(TQKE`H+xP-cbI8Nt_rg3kWH-uUE%VC!l7*N>5Rrb^L0g(N7um^e9~4J#+Ky;&{`f?K&-uDwQtgrLlQtK^sUU!%JLo;ToZ4nPPWNJ4VbRwS#GqV;Ba%@~~ zpFAL&K}$rse1D_AV;oy6qy~gQb7D9k15Ax$AAz<;1%)w7XD7O=CARsQ8G~Qi_9%0( z+Wz9L|CS@Xr7F!+^~43uIA_qD#t#QBE{Vq(R0Ul&Txj$q1dTh(8yltv4u$dj&DPfM zx8(f11*qBt7qjjGXGAbzuFQ~ZK9eCN@;>S~()1#~M)G%+buY&D-1i{mX-z)B0CO>F z8!WYp!Dq_7D)Ze{-^6$ih_%>mN*@0*y`XO4hsThaMrUsIhwo_vrlHc+t(WU!wpk6 zrAw&yet482AqAY}xgcy`s-L`XX=zb*1k=Cf)+Gqw?rWw*z+<~#s+X6!lhQk@6iq4# zFY(g@ciy4DnDkebv8b@nu3jUYG~5CO>w6+x!Vp=Fa#+_QtnoFz4NpE563{)&L;n;- zB=BW|3?OB>*(KFDK({;9F8xb(Tw%rs;)l|CG7qU2>i9hN)4ifrND~UO`tV{B0>PVreJ=ofRU4ko zPg!x3Ax#so8T%l#v_+R*!#;9p*UH&(gpedoZ@Y|sc{}8=u%zpwEr9*`%1wb&Id`P3 zkG-LPf9H(w((a%`v|C2pBa-y!56WsTG|Dj$9M0Bkb^K6b!r9l?r2QHl50O@VR;*8dd0aCPfcpYok0>SxhvD9fxL$GbynlwwCvS`P zf@yK7$!IFDD=RA_8`XjDzN?5mu(mASMYho0YDwYKGOYC*6nY(?^9;h8>W z{6Iwk3|Jt9K$d61;sRok6{Y-Aj-k`)^h}sB4H4vsAgF}62^~nF0L=ver-+B|dU3FV9b~yZNQ%!kflh70yUgt- zNGgWY-;aov!9l4g=UzzQtXg<*GKT#0tsamFPymTeyR>^C=n=X>ua57^OhKXg*Q}%V z*vLt+^9ckrOH@>iKQxD@7Dp^!_Q#p02wRUlZm8$k-G{*fm7>F5pNY5vgkIFwTV9Y$ z%PVNb_gJIV%kP>uThPm`3w;(71ON1sTAL->nU^5jeEsY8p?lQd-$>}S*}b@^=a7~W zTXyAaWtE~X+~FL2hXjqyh*dU7Yj{J6lV1CwOI$AXmI=@f!2qupg6aVDw21;+E&SFi zP;9k}{nnzV$XV_A`?Ulz0q1^PY{~K&TR%-YNJkoQaW_tIej%J0=T0g%IwD642`w&K zEafLCcmo6j`{Dx;Z5tbgZ*R|r>)Mj_{mlAc<{IpqNkUy~AuRc%i zA6DNOk2xg4z>p}n`l6xygqm9Fw31rw|krjA3_8{LIVS zDn~+8ojKB>VA-T35+swk zHrH#vspl3GS*`uonQV8eX)O+8CU-!W*w|bvy{YhBk1IGV){`I2S1H0e6R)2JV`~uz zej}romq{uV&Ow7fL1AsoiX6?Atn+2-{!y^u&p>zp0_GMLbb#O$p5<~JESu+T6HMeD=%*H zhQSSHXe|6HF6bNH8xt(s8ZYyk&cYok_~TF27M!in+v1K~A7037=z;FhNXl7Ci;dkv zW7J67EdeZ~f^La(5}ptHP3K5uqykyx!@hiV_7R{Vh@L^7#=;RPpPc*}(z;NH@CKbujUjwU|b$$H=O@r}62_rETJ1hOKv zaIH+=$csgi7&^U1HwO&seC6_i% zQ#vG6=GouAKDrOn(-=ro5WXfS zS9$gg{t+YD1fue5G99!SHHkODA2@UZ&s4NC)pw0+q|pO)#KV!oHJ>(wCE_tpXlsA- zZO#(Sf~zF6!J~N}GI)@2uk2>X)zm*cypeV?uyvv_Y;Qi?yp-=On&Jl zz{d~MU%cAAykho$b|GBBH6?KP+9b9+La$nOZ=%llb|r&3Mo_Pk#fxrYg8$0LB@T8s zo)f!gANT3Z->h7Pe#*63r+Lo%Gp~=RhK~69XQj;^mPXyC-+{4$l&=L%tJ^rE)KC8wimT{iC<-P# zB5<4>vt&O;^-F2!(t@k|_{AMG^MOJ^%S}??7MzCa2_(Q}GMt1=La{`jbgTKHd@c5U zPvEclc|!l@hgMeqy5C0UCHuw}7Ccje*A@#c*Nc}ciuWxm=$dz!LNB2AKM>bGpNvFo z$sga7K_FSNf#Z+1${NWI^qXo8ZOaqeI2N0ZOJ>d_n#9Gs=FD4#>=&CuLod(%uU@V@ ztf?%EKL(K*SzsxO2n2`71O#OSlrE?gN16`OlqL)yB}954Qp8;mBFS2?022j4Gz`52 zLz97kbP$3e0fQh-gbXb}LSXM>*4f$m*M6Jt%lDn{zWdHS_ug~P?|1U@E{2mzyt*M% z%6qpZU(+*Ez)2C)5(H-tHlY(7#r5Lc73L?r=jNFvuH6!E?31bIvAhDS<>lpO zT(=?8k5kgbVD|Q&b;FIUpdZUX(D%8c6@9N?pB~=4uAGMUcip4RD_GTAL1dt-h78|P z7CUcLvg)I8EWaI4;yrbJbOa|Z$XjsNo`CLQqu(-o-p|`|rs({-gOi={T(xebu&{!A z2{^-x@i3|1Qc^G&;ah?!Vl6UqB^YSl!Es{&aAvNgyy5czs ztLPGLgxUz+?uDQ#*JpaJ4aSsr4fem2gP>q_*{ox+jbc?8 z#%7m$bnENziCE3=GO;uZd8gLuG1u8y#@DHOG8Gy+_*0b_6 z2+BRv7*Os!U+KTm79<($!sqEVC|UOyqvq={UAe1#*bP)WoSIj+=90x{t(0T1nr`1V zAj`ji%mM>58@}p_<+SUJ7tvRnGx(3|q?uark^Wg%Kh7*Lg*{~W^8%~Vaj_}O4EHpGY2+|ZyJy5BvzqY=5BgdYWv|e*Gj$P-m`DQI2 zuXXcfxL>rFHdwm{NPQ*USrJyNuUt`T@koTV+d55)Mvc6lSt}5m>Q0HSU&#e8(4Trr zp-`+Hz{Ct?vm`Rl70|xI6A0skc!%NjOm>Tssle53V@RW=p5*KLlMAm1OY^|B{5&FO zZhwEbo+g+>mcsxQ6uc-8t|+cKrB#_#;!!~N2J7ri{BwzTPdt< zQ-&b&$;OzLuSJ!r`Mc zCH|lWj=nR~mIWR5%kKi=`&+hmC;^_AWA$qvcc84!V#1DeaB7BD^MM~ zGIl`Fo2R3)KT(`CVuAcOm^jra1VMMQKaazB4dQEINTWE!MPc8*)DF{xNMkNzT*Ouc z%FG{ydPgTOHpt`I^#_Wmlgt|{#y#VU8pQ+}N-G5;n2k=Amw=8nsn$Y!!^ht?NGTg( z=-*(<;|07m7BSvfMa5%_ddkpL7Se5$QUs?_j@E63Up8txTfNu3$%Q<5Lkn%td2R#cOu#BIO>1vpDVf z+gV%oRBA!}UT62E2??A2ct_mvZ|K8Bg8#5`W<~x*z%2P6x&U6y7?YxOq zod;1*Gj@p)Wp8iqyY(!8k!lX(bL3&|vrpu8{FyimG2*y*z)Y zbpcNZB#(AJr;n}q5Q=Q-$tKEoU&Im)Hh2k>8+~(x085hNlv!uR@B$p_1?@WbTZawG zjr64;-5#)^Ew$?m9~BjEdcM}9mGtz4*UH3ka(N|K#-l*Y1@$fTJ;IS(G@v!&@8l zP<93%kMJ%3xDu(Q?*UGuP-3%UYdwTh?++6ZbIwJNmvNE5ToaYm-TkdQVH7e;+M`TS>vo9> zY`Q?2T37|lCle#^JK>Pt^Q=8h-y`gv0z-R%$LHfo+3MgCx70a->%x@ZaJRX&oSO^F! z$SRs0IUx8@+Z1@4AHL~UOyCkItyQcLg~!x29dW*W;RhS1kasw){2~A4a7UO&-!=$z zG+a*i9b$Z4bnqYTs0q))Zj|2kbv-3?`o)I`o{3(35j;_K?PUBP!1`#?#U!hrK*29T zj4*!AbAlJBOkE$Odys2{K;wQDvL|TVe-dPC(o-_rY6)MzPEJ>x*oi$1ct7K`;~7Gj z@GX#~A(?}?wsRqgDF8BF<+fh{cY0}q?J4=rSHqxPyhI(AU47MI*#OAjs#-h%Y98(a zY95y5z-nyLK@p*w$AU-7fYHHr)(KYW2S$BW5kdW+ruQlWR$mcG-j-o&teNg$s3*ID z%HFal*s{y8nhJ{oSPk<8FrMj0-Igt2nLKpo=`b`0gB)6qzAXc60{CW&Ctj45>O1QN zHiH;Hc2`QObh8bWuJB|Iti=MbX?mt__4yggqDm@{4^j~oIf09Xl9|qvLgKOj63d`+6>T@vsT95o^CkN%r zZ^hcm%1Y#l&_&?zA7T)$_bt*V5%&K^nM(KoIbvF)qpb9ln_~vf_;c;{yCG9M7ZN-- V%P$zALQoL+d}m>2UUbqc>96+2rQrYo literal 0 HcmV?d00001 diff --git a/kukuc-clock.py b/kukuc-clock.py index 85ac449..a7dc8ab 100644 --- a/kukuc-clock.py +++ b/kukuc-clock.py @@ -3,16 +3,15 @@ import sys import time from datetime import datetime import subprocess -from slovak_datetime_formatter import get_datetime_as_slovak_sentence +from lib.slovak_datetime_formatter import get_datetime_as_slovak_sentence if len(sys.argv) > 1 and sys.argv[1] == "test": - import dummygpio as GPIO + import lib.dummygpio as GPIO else: import RPi.GPIO as GPIO -BUTTON_TIMEOUT = ( - 30 # button release timeout terminates playing -) +TTS_API_URL = "https://tts.virtonline.eu/api/tts" +BUTTON_TIMEOUT = 30 # button release timeout terminates playing PIN = 27 # listen to changes on this GPIO pin GPIO.setmode(GPIO.BCM) # use BCM pin layout GPIO.setwarnings(False) @@ -56,11 +55,16 @@ def generate_presny_cas(): username, password = get_credentials() subprocess.call( [ - "curl", "--silent", "-u", f"{username}:{password}", + "curl", + "--silent", + "-u", + f"{username}:{password}", "--get", - "--data-urlencode", f"text={text}", - "https://tts.virtonline.eu/api/tts", - "--output", "presny_cas.wav", + "--data-urlencode", + f"text={text}", + TTS_API_URL, + "--output", + "presny_cas.wav", ] ) print("Generated presny_cas.wav") diff --git a/dummygpio.py b/lib/dummygpio.py similarity index 91% rename from dummygpio.py rename to lib/dummygpio.py index b9d2811..96f9e19 100644 --- a/dummygpio.py +++ b/lib/dummygpio.py @@ -5,7 +5,7 @@ LOW = False IN = 0 PUD_UP = None DUMMY_FALLING_EDGE = "FALLING" -CHANGE_PIN_VALUE_AFTER = 8 # Transition to HIGH after 5 seconds +CHANGE_PIN_VALUE_AFTER = 8 # Transition to HIGH after 8 seconds BCM = 0 FALLING = None pull_up_down = {PUD_UP: DUMMY_FALLING_EDGE} diff --git a/slovak_datetime_formatter.py b/lib/slovak_datetime_formatter.py similarity index 52% rename from slovak_datetime_formatter.py rename to lib/slovak_datetime_formatter.py index 94508e5..4a460c4 100644 --- a/slovak_datetime_formatter.py +++ b/lib/slovak_datetime_formatter.py @@ -1,7 +1,7 @@ from datetime import datetime hodiny_slovnik = { - 0: "dvanásť", + 0: "nula", 1: "jedna", 2: "dve", 3: "tri", @@ -14,18 +14,17 @@ hodiny_slovnik = { 10: "desať", 11: "jedenásť", 12: "dvanásť", - 13: "jedna", - 14: "dve", - 15: "tri", - 16: "štyri", - 17: "päť", - 18: "šesť", - 19: "sedem", - 20: "osem", - 21: "deväť", - 22: "desať", - 23: "jedenásť", - 24: "dvanásť", + 13: "trinásť", + 14: "štrnásť", + 15: "pätnásť", + 16: "šestnásť", + 17: "sedemnásť", + 18: "osemnásť", + 19: "devätnásť", + 20: "dvadsať", + 21: "dvadsaťjeden", + 22: "dvadsaťdva", + 23: "dvadsaťtri", } minuty_slovnik = { @@ -50,45 +49,45 @@ minuty_slovnik = { 18: "osemnásť", 19: "devätnásť", 20: "dvadsať", - 21: "dvadsať jedna", - 22: "dvadsať dve", - 23: "dvadsať tri", - 24: "dvadsať štyri", - 25: "dvadsať päť", - 26: "dvadsať šesť", - 27: "dvadsať sedem", - 28: "dvadsať osem", - 29: "dvadsať deväť", + 21: "dvadsaťjeden", + 22: "dvadsaťdva", + 23: "dvadsaťtri", + 24: "dvadsaťštyri", + 25: "dvadsaťpäť", + 26: "dvadsaťšesť", + 27: "dvadsaťsedem", + 28: "dvadsaťosem", + 29: "dvadsaťdeväť", 30: "tridsať", - 31: "tridsať jedna", - 32: "tridsať dve", - 33: "tridsať tri", - 34: "tridsať štyri", - 35: "tridsať päť", - 36: "tridsať šesť", - 37: "tridsať sedem", - 38: "tridsať osem", - 39: "tridsať deväť", + 31: "tridsaťjeden", + 32: "tridsaťdva", + 33: "tridsaťtri", + 34: "tridsaťštyri", + 35: "tridsaťpäť", + 36: "tridsaťšesť", + 37: "tridsaťsedem", + 38: "tridsaťosem", + 39: "tridsaťdeväť", 40: "štyridsať", - 41: "štyridsať jedna", - 42: "štyridsať dve", - 43: "štyridsať tri", - 44: "štyridsať štyri", - 45: "štyridsať päť", - 46: "štyridsať šesť", - 47: "štyridsať sedem", - 48: "štyridsať osem", - 49: "štyridsať deväť", + 41: "štyridsaťjeden", + 42: "štyridsaťdva", + 43: "štyridsaťtri", + 44: "štyridsaťštyri", + 45: "štyridsaťpäť", + 46: "štyridsaťšesť", + 47: "štyridsaťsedem", + 48: "štyridsaťosem", + 49: "štyridsaťdeväť", 50: "päťdesiat", - 51: "päťdesiat jedna", - 52: "päťdesiat dve", - 53: "päťdesiat tri", - 54: "päťdesiat štyri", - 55: "päťdesiat päť", - 56: "päťdesiat šesť", - 57: "päťdesiat sedem", - 58: "päťdesiat osem", - 59: "päťdesiat deväť", + 51: "päťdesiatjeden", + 52: "päťdesiatdva", + 53: "päťdesiattri", + 54: "päťdesiatštyri", + 55: "päťdesiatpäť", + 56: "päťdesiatšesť", + 57: "päťdesiatsedem", + 58: "päťdesiatosem", + 59: "päťdesiatdeväť", } dni_slovnik = { @@ -150,28 +149,41 @@ cisla = { 31: "tridsiateho prvého", } + def format_hodiny(hodina): - if hodina == 'jedna': - return 'hodina' - elif hodina.endswith('dve') or hodina.endswith('tri') or hodina.endswith('štyri'): - return 'hodiny' + if hodina == "jedna": + return "hodina" + elif hodina == "dve" or hodina == "tri" or hodina == "štyri": + return "hodiny" else: - return 'hodín' + return "hodín" + def format_minuty(minuta): - if minuta == 'jedna': - return 'minúta' - elif minuta == 'dve' or minuta == 'tri' or minuta == 'štyri': - return 'minúty' + if minuta == "jedna": + return "minúta" + elif minuta == "dve" or minuta == "tri" or minuta == "štyri": + return "minúty" else: - return 'minút' + return "minút" + + +def format_prefix(hodiny): + if hodiny == "jedna": + return "Je" + elif hodiny == "dve" or hodiny == "tri" or hodiny == "štyri": + return "Sú" + else: + return "Je" + # Zobrazenie času a dátumu def get_datetime_as_slovak_sentence(cas): - hodiny = hodiny_slovnik[cas.hour % 12] + hodiny = hodiny_slovnik[cas.hour] minuty = minuty_slovnik[cas.minute] - return f"Je {hodiny} {format_hodiny(hodiny)} a {minuty} {format_minuty(minuty)}, {dni_slovnik[cas.weekday()]}, {cisla[cas.day]} {mesiace_slovnik[cas.month]}" + return f"{format_prefix(hodiny)} {hodiny} {format_hodiny(hodiny)} a {minuty} {format_minuty(minuty)}, {dni_slovnik[cas.weekday()]}, {cisla[cas.day]} {mesiace_slovnik[cas.month]}" + if __name__ == "__main__": print(get_datetime_as_slovak_sentence(datetime.now())) diff --git a/tests/test_data.csv b/tests/test_data.csv new file mode 100644 index 0000000..c44d0a3 --- /dev/null +++ b/tests/test_data.csv @@ -0,0 +1,175 @@ +00:00;01-01-2023;Je nula hodín a nula minút, nedeľa, prvého januára +00:01;01-01-2023;Je nula hodín a jedna minúta, nedeľa, prvého januára +00:02;01-01-2023;Je nula hodín a dve minúty, nedeľa, prvého januára +00:03;01-01-2023;Je nula hodín a tri minúty, nedeľa, prvého januára +00:04;01-01-2023;Je nula hodín a štyri minúty, nedeľa, prvého januára +00:05;01-01-2023;Je nula hodín a päť minút, nedeľa, prvého januára +00:06;01-01-2023;Je nula hodín a šesť minút, nedeľa, prvého januára +00:07;01-01-2023;Je nula hodín a sedem minút, nedeľa, prvého januára +00:08;01-01-2023;Je nula hodín a osem minút, nedeľa, prvého januára +00:09;01-01-2023;Je nula hodín a deväť minút, nedeľa, prvého januára +00:10;01-01-2023;Je nula hodín a desať minút, nedeľa, prvého januára +00:11;01-01-2023;Je nula hodín a jedenásť minút, nedeľa, prvého januára +00:12;01-01-2023;Je nula hodín a dvanásť minút, nedeľa, prvého januára +00:13;01-01-2023;Je nula hodín a trinásť minút, nedeľa, prvého januára +00:14;01-01-2023;Je nula hodín a štrnásť minút, nedeľa, prvého januára +00:15;01-01-2023;Je nula hodín a pätnásť minút, nedeľa, prvého januára +00:16;01-01-2023;Je nula hodín a šestnásť minút, nedeľa, prvého januára +00:17;01-01-2023;Je nula hodín a sedemnásť minút, nedeľa, prvého januára +00:18;01-01-2023;Je nula hodín a osemnásť minút, nedeľa, prvého januára +00:19;01-01-2023;Je nula hodín a devätnásť minút, nedeľa, prvého januára +00:20;01-01-2023;Je nula hodín a dvadsať minút, nedeľa, prvého januára +00:21;01-01-2023;Je nula hodín a dvadsaťjeden minút, nedeľa, prvého januára +00:22;01-01-2023;Je nula hodín a dvadsaťdva minút, nedeľa, prvého januára +00:23;01-01-2023;Je nula hodín a dvadsaťtri minút, nedeľa, prvého januára +00:24;01-01-2023;Je nula hodín a dvadsaťštyri minút, nedeľa, prvého januára +00:25;01-01-2023;Je nula hodín a dvadsaťpäť minút, nedeľa, prvého januára +00:26;01-01-2023;Je nula hodín a dvadsaťšesť minút, nedeľa, prvého januára +00:27;01-01-2023;Je nula hodín a dvadsaťsedem minút, nedeľa, prvého januára +00:28;01-01-2023;Je nula hodín a dvadsaťosem minút, nedeľa, prvého januára +00:29;01-01-2023;Je nula hodín a dvadsaťdeväť minút, nedeľa, prvého januára +00:30;01-01-2023;Je nula hodín a tridsať minút, nedeľa, prvého januára +00:31;01-01-2023;Je nula hodín a tridsaťjeden minút, nedeľa, prvého januára +00:32;01-01-2023;Je nula hodín a tridsaťdva minút, nedeľa, prvého januára +00:33;01-01-2023;Je nula hodín a tridsaťtri minút, nedeľa, prvého januára +00:34;01-01-2023;Je nula hodín a tridsaťštyri minút, nedeľa, prvého januára +00:35;01-01-2023;Je nula hodín a tridsaťpäť minút, nedeľa, prvého januára +00:36;01-01-2023;Je nula hodín a tridsaťšesť minút, nedeľa, prvého januára +00:37;01-01-2023;Je nula hodín a tridsaťsedem minút, nedeľa, prvého januára +00:38;01-01-2023;Je nula hodín a tridsaťosem minút, nedeľa, prvého januára +00:39;01-01-2023;Je nula hodín a tridsaťdeväť minút, nedeľa, prvého januára +00:40;01-01-2023;Je nula hodín a štyridsať minút, nedeľa, prvého januára +00:41;01-01-2023;Je nula hodín a štyridsaťjeden minút, nedeľa, prvého januára +00:42;01-01-2023;Je nula hodín a štyridsaťdva minút, nedeľa, prvého januára +00:43;01-01-2023;Je nula hodín a štyridsaťtri minút, nedeľa, prvého januára +00:44;01-01-2023;Je nula hodín a štyridsaťštyri minút, nedeľa, prvého januára +00:45;01-01-2023;Je nula hodín a štyridsaťpäť minút, nedeľa, prvého januára +00:46;01-01-2023;Je nula hodín a štyridsaťšesť minút, nedeľa, prvého januára +00:47;01-01-2023;Je nula hodín a štyridsaťsedem minút, nedeľa, prvého januára +00:48;01-01-2023;Je nula hodín a štyridsaťosem minút, nedeľa, prvého januára +00:49;01-01-2023;Je nula hodín a štyridsaťdeväť minút, nedeľa, prvého januára +00:50;01-01-2023;Je nula hodín a päťdesiat minút, nedeľa, prvého januára +00:51;01-01-2023;Je nula hodín a päťdesiatjeden minút, nedeľa, prvého januára +00:52;01-01-2023;Je nula hodín a päťdesiatdva minút, nedeľa, prvého januára +00:53;01-01-2023;Je nula hodín a päťdesiattri minút, nedeľa, prvého januára +00:54;01-01-2023;Je nula hodín a päťdesiatštyri minút, nedeľa, prvého januára +00:55;01-01-2023;Je nula hodín a päťdesiatpäť minút, nedeľa, prvého januára +00:56;01-01-2023;Je nula hodín a päťdesiatšesť minút, nedeľa, prvého januára +00:57;01-01-2023;Je nula hodín a päťdesiatsedem minút, nedeľa, prvého januára +00:58;01-01-2023;Je nula hodín a päťdesiatosem minút, nedeľa, prvého januára +00:59;01-01-2023;Je nula hodín a päťdesiatdeväť minút, nedeľa, prvého januára + +00:00;01-01-2023;Je nula hodín a nula minút, nedeľa, prvého januára +01:00;01-01-2023;Je jedna hodina a nula minút, nedeľa, prvého januára +02:00;01-01-2023;Sú dve hodiny a nula minút, nedeľa, prvého januára +03:00;01-01-2023;Sú tri hodiny a nula minút, nedeľa, prvého januára +04:00;01-01-2023;Sú štyri hodiny a nula minút, nedeľa, prvého januára +05:00;01-01-2023;Je päť hodín a nula minút, nedeľa, prvého januára +06:00;01-01-2023;Je šesť hodín a nula minút, nedeľa, prvého januára +07:00;01-01-2023;Je sedem hodín a nula minút, nedeľa, prvého januára +08:00;01-01-2023;Je osem hodín a nula minút, nedeľa, prvého januára +09:00;01-01-2023;Je deväť hodín a nula minút, nedeľa, prvého januára +10:00;01-01-2023;Je desať hodín a nula minút, nedeľa, prvého januára +11:00;01-01-2023;Je jedenásť hodín a nula minút, nedeľa, prvého januára +12:00;01-01-2023;Je dvanásť hodín a nula minút, nedeľa, prvého januára +13:00;01-01-2023;Je trinásť hodín a nula minút, nedeľa, prvého januára +14:00;01-01-2023;Je štrnásť hodín a nula minút, nedeľa, prvého januára +15:00;01-01-2023;Je pätnásť hodín a nula minút, nedeľa, prvého januára +16:00;01-01-2023;Je šestnásť hodín a nula minút, nedeľa, prvého januára +17:00;01-01-2023;Je sedemnásť hodín a nula minút, nedeľa, prvého januára +18:00;01-01-2023;Je osemnásť hodín a nula minút, nedeľa, prvého januára +19:00;01-01-2023;Je devätnásť hodín a nula minút, nedeľa, prvého januára +20:00;01-01-2023;Je dvadsať hodín a nula minút, nedeľa, prvého januára +21:00;01-01-2023;Je dvadsaťjeden hodín a nula minút, nedeľa, prvého januára +22:00;01-01-2023;Je dvadsaťdva hodín a nula minút, nedeľa, prvého januára +23:00;01-01-2023;Je dvadsaťtri hodín a nula minút, nedeľa, prvého januára + +00:00;01-01-2023;Je nula hodín a nula minút, nedeľa, prvého januára +00:00;02-01-2023;Je nula hodín a nula minút, pondelok, druhého januára +00:00;03-01-2023;Je nula hodín a nula minút, utorok, tretieho januára +00:00;04-01-2023;Je nula hodín a nula minút, streda, štvrtého januára +00:00;05-01-2023;Je nula hodín a nula minút, štvrtok, piateho januára +00:00;06-01-2023;Je nula hodín a nula minút, piatok, šiesteho januára +00:00;07-01-2023;Je nula hodín a nula minút, sobota, siedmeho januára +00:00;08-01-2023;Je nula hodín a nula minút, nedeľa, ôsmeho januára +00:00;09-01-2023;Je nula hodín a nula minút, pondelok, deviateho januára +00:00;10-01-2023;Je nula hodín a nula minút, utorok, desiateho januára +00:00;11-01-2023;Je nula hodín a nula minút, streda, jedenásteho januára +00:00;12-01-2023;Je nula hodín a nula minút, štvrtok, dvanásteho januára +00:00;13-01-2023;Je nula hodín a nula minút, piatok, trinásteho januára +00:00;14-01-2023;Je nula hodín a nula minút, sobota, štrnásteho januára +00:00;15-01-2023;Je nula hodín a nula minút, nedeľa, pätnásteho januára +00:00;16-01-2023;Je nula hodín a nula minút, pondelok, šestnásteho januára +00:00;17-01-2023;Je nula hodín a nula minút, utorok, sedemnásteho januára +00:00;18-01-2023;Je nula hodín a nula minút, streda, osemnásteho januára +00:00;19-01-2023;Je nula hodín a nula minút, štvrtok, devätnásteho januára +00:00;20-01-2023;Je nula hodín a nula minút, piatok, dvadsiateho januára +00:00;21-01-2023;Je nula hodín a nula minút, sobota, dvadsiateho prvého januára +00:00;22-01-2023;Je nula hodín a nula minút, nedeľa, dvadsiateho druhého januára +00:00;23-01-2023;Je nula hodín a nula minút, pondelok, dvadsiateho tretieho januára +00:00;24-01-2023;Je nula hodín a nula minút, utorok, dvadsiateho štvrtého januára +00:00;25-01-2023;Je nula hodín a nula minút, streda, dvadsiateho piateho januára +00:00;26-01-2023;Je nula hodín a nula minút, štvrtok, dvadsiateho šiesteho januára +00:00;27-01-2023;Je nula hodín a nula minút, piatok, dvadsiateho siedmeho januára +00:00;28-01-2023;Je nula hodín a nula minút, sobota, dvadsiateho ôsmeho januára +00:00;29-01-2023;Je nula hodín a nula minút, nedeľa, dvadsiateho deviateho januára +00:00;30-01-2023;Je nula hodín a nula minút, pondelok, tridsiateho januára +00:00;31-01-2023;Je nula hodín a nula minút, utorok, tridsiateho prvého januára + +00:00;01-01-2023;Je nula hodín a nula minút, nedeľa, prvého januára +00:00;01-02-2023;Je nula hodín a nula minút, streda, prvého februára +00:00;01-03-2023;Je nula hodín a nula minút, streda, prvého marca +00:00;01-04-2023;Je nula hodín a nula minút, sobota, prvého apríla +00:00;01-05-2023;Je nula hodín a nula minút, pondelok, prvého mája +00:00;01-06-2023;Je nula hodín a nula minút, štvrtok, prvého júna +00:00;01-07-2023;Je nula hodín a nula minút, sobota, prvého júla +00:00;01-08-2023;Je nula hodín a nula minút, utorok, prvého augusta +00:00;01-09-2023;Je nula hodín a nula minút, piatok, prvého septembra +00:00;01-10-2023;Je nula hodín a nula minút, nedeľa, prvého októbra +00:00;01-11-2023;Je nula hodín a nula minút, streda, prvého novembra +00:00;01-12-2023;Je nula hodín a nula minút, piatok, prvého decembra + + +14:23;04-02-2023;Je štrnásť hodín a dvadsaťtri minút, sobota, štvrtého februára +03:16;15-03-2023;Sú tri hodiny a šestnásť minút, streda, pätnásteho marca +21:45;27-04-2023;Je dvadsaťjeden hodín a štyridsaťpäť minút, štvrtok, dvadsiateho siedmeho apríla +07:07;09-05-2023;Je sedem hodín a sedem minút, utorok, deviateho mája +00:00;20-06-2023;Je nula hodín a nula minút, utorok, dvadsiateho júna +12:30;11-07-2023;Je dvanásť hodín a tridsať minút, utorok, jedenásteho júla +18:55;22-08-2023;Je osemnásť hodín a päťdesiatpäť minút, utorok, dvadsiateho druhého augusta +23:11;30-09-2023;Je dvadsaťtri hodín a jedenásť minút, sobota, tridsiateho septembra +05:20;01-10-2023;Je päť hodín a dvadsať minút, nedeľa, prvého októbra +16:42;13-11-2023;Je šestnásť hodín a štyridsaťdva minút, pondelok, trinásteho novembra +08:08;04-12-2023;Je osem hodín a osem minút, pondelok, štvrtého decembra +22:22;17-01-2023;Je dvadsaťdva hodín a dvadsaťdva minút, utorok, sedemnásteho januára +11:11;28-02-2023;Je jedenásť hodín a jedenásť minút, utorok, dvadsiateho ôsmeho februára +02:02;19-03-2023;Sú dve hodiny a dve minúty, nedeľa, devätnásteho marca +19:19;05-04-2023;Je devätnásť hodín a devätnásť minút, streda, piateho apríla +06:06;16-05-2023;Je šesť hodín a šesť minút, utorok, šestnásteho mája +13:13;07-06-2023;Je trinásť hodín a trinásť minút, streda, siedmeho júna +17:17;18-07-2023;Je sedemnásť hodín a sedemnásť minút, utorok, osemnásteho júla +09:09;29-08-2023;Je deväť hodín a deväť minút, utorok, dvadsiateho deviateho augusta +15:15;10-09-2023;Je pätnásť hodín a pätnásť minút, nedeľa, desiateho septembra + + +10:25;07-03-2023;Je desať hodín a dvadsaťpäť minút, utorok, siedmeho marca +22:40;14-06-2023;Je dvadsaťdva hodín a štyridsať minút, streda, štrnásteho júna +03:55;21-09-2023;Sú tri hodiny a päťdesiatpäť minút, štvrtok, dvadsiateho prvého septembra +15:10;28-12-2023;Je pätnásť hodín a desať minút, štvrtok, dvadsiateho ôsmeho decembra +06:05;02-02-2023;Je šesť hodín a päť minút, štvrtok, druhého februára +18:15;16-05-2023;Je osemnásť hodín a pätnásť minút, utorok, šestnásteho mája +07:20;25-07-2023;Je sedem hodín a dvadsať minút, utorok, dvadsiateho piateho júla +19:30;30-10-2023;Je devätnásť hodín a tridsať minút, pondelok, tridsiateho októbra +08:45;11-01-2023;Je osem hodín a štyridsaťpäť minút, streda, jedenásteho januára +20:50;17-04-2023;Je dvadsať hodín a päťdesiat minút, pondelok, sedemnásteho apríla +01:35;23-08-2023;Je jedna hodina a tridsaťpäť minút, streda, dvadsiateho tretieho augusta +13:25;04-11-2023;Je trinásť hodín a dvadsaťpäť minút, sobota, štvrtého novembra +02:10;09-03-2023;Sú dve hodiny a desať minút, štvrtok, deviateho marca +14:55;15-07-2023;Je štrnásť hodín a päťdesiatpäť minút, sobota, pätnásteho júla +05:40;24-10-2023;Je päť hodín a štyridsať minút, utorok, dvadsiateho štvrtého októbra +17:50;06-02-2023;Je sedemnásť hodín a päťdesiat minút, pondelok, šiesteho februára +04:30;12-05-2023;Sú štyri hodiny a tridsať minút, piatok, dvanásteho mája +16:45;27-09-2023;Je šestnásť hodín a štyridsaťpäť minút, streda, dvadsiateho siedmeho septembra +09:15;31-12-2023;Je deväť hodín a pätnásť minút, nedeľa, tridsiateho prvého decembra +21:05;08-08-2023;Je dvadsaťjeden hodín a päť minút, utorok, ôsmeho augusta + diff --git a/tests/test_slovak_datetime_formatter.py b/tests/test_slovak_datetime_formatter.py new file mode 100644 index 0000000..6b58d70 --- /dev/null +++ b/tests/test_slovak_datetime_formatter.py @@ -0,0 +1,34 @@ +import unittest +from datetime import datetime +import csv +import imp + +get_datetime_as_slovak_sentence = imp.load_source( + "slovak_datetime_formatter", "../lib/slovak_datetime_formatter.py" +).get_datetime_as_slovak_sentence + + +class TestSlovakDateTimeFormatter(unittest.TestCase): + def test(self): + test_data = [] + with open("test_data.csv") as file: + reader = csv.reader(file, delimiter=";") + for row in reader: + if row: + test_data.append(row) + + for time_str, date_str, expected_text in test_data: + test_datetime = datetime( + int(date_str.split("-")[2]), + int(date_str.split("-")[1]), + int(date_str.split("-")[0]), + int(time_str.split(":")[0]), + int(time_str.split(":")[1]), + ) + + output_text = get_datetime_as_slovak_sentence(test_datetime) + self.assertEqual(output_text, expected_text) + + +if __name__ == "__main__": + unittest.main()