From c743dcc76891686a0828e9665829eab97ff98c43 Mon Sep 17 00:00:00 2001 From: Vladimir Roncevic Date: Tue, 9 Jul 2024 21:02:21 +0200 Subject: [PATCH] [gen_stm32] Updated ATS CLI mechanism, docs --- .editorconfig | 2 +- .gitignore | 2 +- LICENSE | 2 +- MANIFEST.in | 2 +- README.md | 226 ++++++------- docs/build/doctrees/environment.pickle | Bin 246629 -> 248062 bytes docs/build/doctrees/gen_stm32.doctree | Bin 29594 -> 29570 bytes docs/build/doctrees/gen_stm32.pro.doctree | Bin 34647 -> 35391 bytes .../gen_stm32.pro.write_template.doctree | Bin 27428 -> 27762 bytes docs/build/html/_modules/gen_stm32.html | 20 +- docs/build/html/_modules/gen_stm32/pro.html | 24 +- .../_modules/gen_stm32/pro/read_template.html | 8 +- .../gen_stm32/pro/write_template.html | 12 +- docs/build/html/gen_stm32.html | 2 +- docs/build/html/gen_stm32.pro.html | 6 +- .../html/gen_stm32.pro.write_template.html | 2 +- docs/build/html/objects.inv | Bin 560 -> 560 bytes docs/build/html/searchindex.js | 2 +- docs/source/conf.py | 2 +- gen_stm32/.editorconfig | 2 +- gen_stm32/__init__.py | 20 +- gen_stm32/conf/gen_stm32.cfg | 2 +- gen_stm32/log/gen_stm32.log | 2 - gen_stm32/pro/__init__.py | 24 +- gen_stm32/pro/read_template.py | 8 +- gen_stm32/pro/write_template.py | 12 +- gen_stm32/run/gen_stm32_run.py | 2 +- pyproject.toml | 2 +- setup.cfg | 2 +- setup.py | 8 +- tests/.coverage | Bin 53248 -> 53248 bytes tests/gen_stm32_coverage.json | 1 + tests/gen_stm32_coverage.xml | 298 ++++++++++++++++++ tests/gen_stm32_setup_test.py | 2 +- tests/gen_stm32_test.py | 12 +- tests/read_template_test.py | 2 +- tests/run_coverage.sh | 8 +- tests/write_template_test.py | 2 +- 38 files changed, 512 insertions(+), 209 deletions(-) create mode 100644 tests/gen_stm32_coverage.json create mode 100644 tests/gen_stm32_coverage.xml diff --git a/.editorconfig b/.editorconfig index e856098..f228d58 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,3 +1,3 @@ [**.py] indent_style = tab -tab_width = 4 +tab_width = 4 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6e4266f..0e4f7f4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ __pycache__/ *.py[cod] -*$py.class +*$py.class \ No newline at end of file diff --git a/LICENSE b/LICENSE index f288702..e72bfdd 100644 --- a/LICENSE +++ b/LICENSE @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. +. \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in index 615e36d..08e203f 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,2 +1,2 @@ global-exclude *.py[cod] -global-exclude *.editorconfig +global-exclude *.editorconfig \ No newline at end of file diff --git a/README.md b/README.md index 0083005..3b20fd1 100644 --- a/README.md +++ b/README.md @@ -107,118 +107,128 @@ gen_stm32 is based on OOP. Generator structure ```bash -gen_stm32/ - ├── conf/ - │ ├── gen_stm32.logo - │   ├── gen_stm32.cfg - │   ├── gen_stm32_util.cfg - │   ├── project.yaml - │   └── template/ - │   ├── build/ - │   │   ├── includes/ - │   │   │   └── STM32F4xx_StdPeriph_Driver/ - │   │   │   └── src/ - │   │   │   └── subdir.template - │   │   ├── Makefile.template - │   │   ├── objects.template - │   │   ├── source/ - │   │   │   └── subdir.template - │   │   └── sources.template - │   ├── includes/ - │   │   ├── CMSIS/ - │   │   │   ├── arm_common_tables.template - │   │   │   ├── arm_math.template - │   │   │   ├── core_cm0.template - │   │   │   ├── core_cm3.template - │   │   │   ├── core_cm4_simd.template - │   │   │   ├── core_cm4.template - │   │   │   ├── core_cmFunc.template - │   │   │   └── core_cmInstr.template - │   │   ├── STM32F4xx/ - │   │   │   ├── stm32f4xx_conf.template - │   │   │   ├── stm32f4xx.template - │   │   │   └── system_stm32f4xx.template - │   │   └── STM32F4xx_StdPeriph_Driver/ - │   │   ├── inc/ - │   │   │   ├── misc.template - │   │   │   ├── stm32f4xx_adc.template - │   │   │   ├── stm32f4xx_can.template - │   │   │   ├── stm32f4xx_crc.template - │   │   │   ├── stm32f4xx_cryp.template - │   │   │   ├── stm32f4xx_dac.template - │   │   │   ├── stm32f4xx_dbgmcu.template - │   │   │   ├── stm32f4xx_dcmi.template - │   │   │   ├── stm32f4xx_dma.template - │   │   │   ├── stm32f4xx_exti.template - │   │   │   ├── stm32f4xx_flash.template - │   │   │   ├── stm32f4xx_fsmc.template - │   │   │   ├── stm32f4xx_gpio.template - │   │   │   ├── stm32f4xx_hash.template - │   │   │   ├── stm32f4xx_i2c.template - │   │   │   ├── stm32f4xx_iwdg.template - │   │   │   ├── stm32f4xx_pwr.template - │   │   │   ├── stm32f4xx_rcc.template - │   │   │   ├── stm32f4xx_rng.template - │   │   │   ├── stm32f4xx_rtc.template - │   │   │   ├── stm32f4xx_sdio.template - │   │   │   ├── stm32f4xx_spi.template - │   │   │   ├── stm32f4xx_syscfg.template - │   │   │   ├── stm32f4xx_tim.template - │   │   │   ├── stm32f4xx_usart.template - │   │   │   └── stm32f4xx_wwdg.template - │   │   └── src/ - │   │   ├── misc.template - │   │   ├── stm32f4xx_adc.template - │   │   ├── stm32f4xx_can.template - │   │   ├── stm32f4xx_crc.template - │   │   ├── stm32f4xx_cryp_aes.template - │   │   ├── stm32f4xx_cryp_des.template - │   │   ├── stm32f4xx_cryp_tdes.template - │   │   ├── stm32f4xx_cryp.template - │   │   ├── stm32f4xx_dac.template - │   │   ├── stm32f4xx_dbgmcu.template - │   │   ├── stm32f4xx_dcmi.template - │   │   ├── stm32f4xx_dma.template - │   │   ├── stm32f4xx_exti.template - │   │   ├── stm32f4xx_flash.template - │   │   ├── stm32f4xx_fsmc.template - │   │   ├── stm32f4xx_gpio.template - │   │   ├── stm32f4xx_hash_md5.template - │   │   ├── stm32f4xx_hash_sha1.template - │   │   ├── stm32f4xx_hash.template - │   │   ├── stm32f4xx_i2c.template - │   │   ├── stm32f4xx_iwdg.template - │   │   ├── stm32f4xx_pwr.template - │   │   ├── stm32f4xx_rcc.template - │   │   ├── stm32f4xx_rng.template - │   │   ├── stm32f4xx_rtc.template - │   │   ├── stm32f4xx_sdio.template - │   │   ├── stm32f4xx_spi.template - │   │   ├── stm32f4xx_syscfg.template - │   │   ├── stm32f4xx_tim.template - │   │   ├── stm32f4xx_usart.template - │   │   └── stm32f4xx_wwdg.template - │   ├── scripts/ - │   │   └── arm_cortex_m4_512.template - │   └── source/ - │   ├── main.template - │   ├── startup_stm32f4xx.template - │   ├── syscall.template - │   ├── system_stm32f4xx.template - │   └── tinynew.template - ├── __init__.py - ├── log/ - │   └── gen_stm32.log - ├── pro/ - │   ├── __init__.py - │   ├── read_template.py - │   └── write_template.py - └── run/ - └── gen_stm32_run.py + gen_stm32/ + ├── conf/ + │ ├── gen_stm32.logo + │   ├── gen_stm32.cfg + │   ├── gen_stm32_util.cfg + │   ├── project.yaml + │   └── template/ + │   ├── build/ + │   │   ├── includes/ + │   │   │   └── STM32F4xx_StdPeriph_Driver/ + │   │   │   └── src/ + │   │   │   └── subdir.template + │   │   ├── Makefile.template + │   │   ├── objects.template + │   │   ├── source/ + │   │   │   └── subdir.template + │   │   └── sources.template + │   ├── includes/ + │   │   ├── CMSIS/ + │   │   │   ├── arm_common_tables.template + │   │   │   ├── arm_math.template + │   │   │   ├── core_cm0.template + │   │   │   ├── core_cm3.template + │   │   │   ├── core_cm4_simd.template + │   │   │   ├── core_cm4.template + │   │   │   ├── core_cmFunc.template + │   │   │   └── core_cmInstr.template + │   │   ├── STM32F4xx/ + │   │   │   ├── stm32f4xx_conf.template + │   │   │   ├── stm32f4xx.template + │   │   │   └── system_stm32f4xx.template + │   │   └── STM32F4xx_StdPeriph_Driver/ + │   │   ├── inc/ + │   │   │   ├── misc.template + │   │   │   ├── stm32f4xx_adc.template + │   │   │   ├── stm32f4xx_can.template + │   │   │   ├── stm32f4xx_crc.template + │   │   │   ├── stm32f4xx_cryp.template + │   │   │   ├── stm32f4xx_dac.template + │   │   │   ├── stm32f4xx_dbgmcu.template + │   │   │   ├── stm32f4xx_dcmi.template + │   │   │   ├── stm32f4xx_dma.template + │   │   │   ├── stm32f4xx_exti.template + │   │   │   ├── stm32f4xx_flash.template + │   │   │   ├── stm32f4xx_fsmc.template + │   │   │   ├── stm32f4xx_gpio.template + │   │   │   ├── stm32f4xx_hash.template + │   │   │   ├── stm32f4xx_i2c.template + │   │   │   ├── stm32f4xx_iwdg.template + │   │   │   ├── stm32f4xx_pwr.template + │   │   │   ├── stm32f4xx_rcc.template + │   │   │   ├── stm32f4xx_rng.template + │   │   │   ├── stm32f4xx_rtc.template + │   │   │   ├── stm32f4xx_sdio.template + │   │   │   ├── stm32f4xx_spi.template + │   │   │   ├── stm32f4xx_syscfg.template + │   │   │   ├── stm32f4xx_tim.template + │   │   │   ├── stm32f4xx_usart.template + │   │   │   └── stm32f4xx_wwdg.template + │   │   └── src/ + │   │   ├── misc.template + │   │   ├── stm32f4xx_adc.template + │   │   ├── stm32f4xx_can.template + │   │   ├── stm32f4xx_crc.template + │   │   ├── stm32f4xx_cryp_aes.template + │   │   ├── stm32f4xx_cryp_des.template + │   │   ├── stm32f4xx_cryp_tdes.template + │   │   ├── stm32f4xx_cryp.template + │   │   ├── stm32f4xx_dac.template + │   │   ├── stm32f4xx_dbgmcu.template + │   │   ├── stm32f4xx_dcmi.template + │   │   ├── stm32f4xx_dma.template + │   │   ├── stm32f4xx_exti.template + │   │   ├── stm32f4xx_flash.template + │   │   ├── stm32f4xx_fsmc.template + │   │   ├── stm32f4xx_gpio.template + │   │   ├── stm32f4xx_hash_md5.template + │   │   ├── stm32f4xx_hash_sha1.template + │   │   ├── stm32f4xx_hash.template + │   │   ├── stm32f4xx_i2c.template + │   │   ├── stm32f4xx_iwdg.template + │   │   ├── stm32f4xx_pwr.template + │   │   ├── stm32f4xx_rcc.template + │   │   ├── stm32f4xx_rng.template + │   │   ├── stm32f4xx_rtc.template + │   │   ├── stm32f4xx_sdio.template + │   │   ├── stm32f4xx_spi.template + │   │   ├── stm32f4xx_syscfg.template + │   │   ├── stm32f4xx_tim.template + │   │   ├── stm32f4xx_usart.template + │   │   └── stm32f4xx_wwdg.template + │   ├── scripts/ + │   │   └── arm_cortex_m4_512.template + │   └── source/ + │   ├── main.template + │   ├── startup_stm32f4xx.template + │   ├── syscall.template + │   ├── system_stm32f4xx.template + │   └── tinynew.template + ├── __init__.py + ├── log/ + │   └── gen_stm32.log + ├── pro/ + │   ├── __init__.py + │   ├── read_template.py + │   └── write_template.py + └── run/ + └── gen_stm32_run.py 19 directories, 89 files ``` +### Code coverage + +| Name | Stmts | Miss | Cover | +|------|-------|------|-------| +| `gen_stm32/__init__.py` | 71 | 12 | 83% | +| `gen_stm32/pro/__init__.py` | 59 | 2 | 97% | +| `gen_stm32/pro/read_template.py` | 52 | 2 | 96% | +| `gen_stm32/pro/write_template.py` | 78 | 3 | 96% | +| **Total** | 260 | 19 | 93% | + ### Docs [![Documentation Status](https://readthedocs.org/projects/gen-stm32/badge/?version=latest)](https://gen-stm32.readthedocs.io/en/latest/?badge=latest) diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle index 2066e27a871b8d3515076eb89e9410b9e6c664a9..852da86d59b40721f717371d02aa72a9b1b5adf7 100644 GIT binary patch literal 248062 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%0AP;lQrmR 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 GZU2AUlv?uu literal 246629 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⪙1e!Z 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 diff --git a/docs/build/doctrees/gen_stm32.doctree b/docs/build/doctrees/gen_stm32.doctree index b3b81c27f0539df013f39d78abb85d472dacc0b6..df1a548ad9b41a8df73885f10773c659fda361d5 100644 GIT binary patch delta 91 zcmbRBoU!RSBTED8)bfoiKJtt@lLO^d*&IWHopUlLx5!&Fs!l#2F9#ENBd-Z#N-MmV flt?TojxR0A%*iatOfA++&dJn+=-jNWm>&cHZAKov delta 128 zcmZpA&N%BiBTED8)c%buKJttvlLO^d`I6JpQ0W3mqVAh zBd^H@Rl}|DUP~ddq&U8`Br_+oBr~;G4`c$WNmEKQw6lIQGB8Y@C|0z&Pw`720NK!e(TfBx^0%KaHMzlzRtaYqOx^O;b^FLUuTcEFB)kF z|F$Pqeqk;VRJA99#&~iDLfe1S60d9^UhulR4e1ywPqBBn@BSWK?rbx`a7hB+jwTK# zh7)DMd?61Gd!3MQuP~FE1&11iLj`l-f6PitL+>&b%of;SgJ&IaP7ixV2{F$s#kz1)#Gy!t;a_-`5Feb_xt3|o+RSj< zWdMC?Rz|+yRe`;K2^6;6Au}jmO|HPqt`)GewVB+)@p4u060Y+*=H;MQRPg2CGH`m! z;Y@!8c_;=vz<@3?hwl#D$XXbCZ3TVG{OwZgUsCJ?Io3lN*=7bR$i>`I96pa7bXwn!@BNVsOYYwm9h*w15RG7 zu9auq#j%BlDsL%kF>OqWZFxp4$6{Wf$?Fbu`ga8OhI=}rf%Y1>SZ6gQ$xxlJY?W|GdaR}t!iv!N3Bw!=&Zm`HWH5ayxDv%Da#Rc258ub>iD zQBaSVCh0w?RCYe+M4%SSQ6G=3UdrH+3b!Sta82}bvS^p2qM3Q@Kn498yEJH_HzYeA zZk?IgZ4H^&>#roSOH9o1yux5%KI}Blu3W|%Edy*=tp@MrG`Ohz`s9*+TT zgoD(sW|)xG7;l4pE-RZrQphHpSR-4TmDbs=a`L*EZbOL<9ye>j+^H9N!O&-TNzL8e zcamnP87FiO>*cT4PT*oCP~O3Le=Z!1uGAUX4kTEJT7qRgc~8tZx>64fu{b@gmf0Ym zhz3KeiMzn!aFbxbduQ@M2e~H4WQjN43>5X3lM8TtunZf09ycx#L4H|~xR)xClV?ft z&=Ltn1F1l$lZPH|9$JNWr4}w9to$z)aF57>`4J{r%)%ozeiD{KYuG|LjReD-n!#X; z>rzsu(6C5SNrNPrii1t5y%+~ck76X^ke)9*6l-=*S+gcu&oso#o~zY}H9vI5N%-f`+izrZG4&EFpG|r(xB4Gp< zAdxVl!H>o!csdj^zRe~@P~r>bI5V%A{%qKqPHs-mj{cs$`3y6@kB?waFeIE}qbYpE z;ynA?hz^7Uee4%NV15(9o(a)qA{Ml>Nij|v3VRrYk?}RYN MAk9!u(__u#UtFcjZU6uP delta 2132 zcmZuyZA@Eb6z0AZdT*f=0+f$_teta!-Jnb=HUlR-X;lS3GdcTE+kYr^(8+4P}iVmfH&orogVgAn9iBX>W2pT#3?W%=(DII;EF9@wCQ|sJos8LU(ks}36%j0Y`9rS zcfS>S(CB1{J#2HbIW}cn+(MmlO z;B)6QHn`lJNf5v`?Zv~L=EL-`YRraP<*8t5Wyv8KmTFgk*zzp_nb0J#WL6139e)fe zoGQ5TViWm*dI}Xf@ya%0_DLl(3(oci_^{PNmbbCjx3RXi67szgip3JR+}1(9k9O4Xt&)&k!dIX_d819o#zcU2+|I1-%fDNjhQPbB+wKQk{!_ zGfZ^z#LL2xu7HfQ;3~H>UO0a83Gxm-7(i2{-*Uevx#{UrLl#`CPA4C4(WJsmPXqOA zK5m3x%2U$oY0Ww@Ch;DAmegSb#vG;wzT~TuS834`1Rr-;(Dy!<+)3*+Iv7OOg0Hua ztkDS+0oyl4?jrf9hdiJb3*f!6_h~fk$SRy6N-lhB3NCs?O$;5|K!{D80DGt9@VMFq@P>2)cw0Z}5ggH_~>kNU+89Ke)#HQd~|J1f_Q z2_=zBs}!Yj4pqK4M?16o>Nt_#M#LI$y;PVR9kMe8v2l0-`%t=vVuxVnwuX>ev>&Vk z1!Q!45X15y)^UtlNC{{alW2gVo-8s=gRJUx`BoC}R?f%r4pZJdjX{hG!AbudI7qK+ zYx`2|N$Oh45mq1z^{;1>8V)|~G-_)wnK(g(yFmX*5?&Qgt+K`zcH*q?ZwPXbo zpLhf2&Ll$UltaBjYnJJ5bFkpig4r)Hf6`IGqJN6~#z}(y2kR@h)06XL0mH%CSp%3# z4PiHvB^hQ;mgvp9 z;gvJB>f5wfS=Bc2TB_yiL|?;b@>(?WF-m z2i5+6v6S~HWnPLwj0zFqZlI8~U|{&eL#2NsMypi%%PK1UOxl<%eG4X)rEdYx*kRCj zsbQr&7Z48Y*s;u~sb5+WdnD2x@{BddGb5qTCw`C5c%Is8@FDaIUhx@vIsyxm8D{F3 z7W$_p+w_QF#t*U_m@IgOgBbP4q=Wr}A`LSFEZPLHG7#ZG=6d|rkV zE;c2DJ$6clSPw#E@~My;ldJtC88=Se5NI;_bEx{{4}Q{&2SGf>eUs-0L^B;`pX}(T zKDj?sc=EJBNyeK{g=$h+{_G44P!k#LrnF9JoKibQBSSjtC0O?}knYKwgEWC!*)}tW z2QV_pb4)Ju(&21k1L~8`lIECv!CRCGNG*&AU^3yDyfM(2$&h36f`BL{GY*iY64D$D z45djx7c*)inGe(<8mN%Z(Y!CO1SkGj)MD+LH}pSee=pTH@8%f%1tlwM@$)ikAQt>rHlwHDTHV6402u zAU2a}2SfwJ!mX&fmjHDKOsy18A!-ZUYBS++1rSBvO!{|s1`{4E=XJ(u0nhBx@Qe8>&K9%i6gm^g?%d249878hK%9ZU{csC7!?l-em88PZvY zCLatnVcb7iAT*lk2>WD5KlRPt5n+ssKY`-9lg~%8Gks;Be8F23M7@s;VB+JLyfM(2 ziJN1xU}zMhz~qZj8WLaG85l~FfX-snoPsbJs6jAV38c?7+6qJ!MjJ4FVxQa?uQYi< zFz;klJ*mkCYAlmKM6X~9=9paQWy}~b`CLphQwoTq&6W`lbY9}*hIlQe0FKFudU9aZ z=i>DzGsbB%H9~aM0d?q2o)BlkGz}!6F*(8Cda`D`9^)jSMkRSource code for gen_stm32
 '''
 
 import sys
-from typing import Any, List, Dict
+from typing import List, Dict, Optional
 from os.path import exists, dirname, realpath
 from os import getcwd
 from argparse import Namespace
@@ -67,7 +67,7 @@ 

Source code for gen_stm32

 try:
     from ats_utilities.splash import Splash
     from ats_utilities.logging import ATSLogger
-    from ats_utilities.cli.cfg_cli import CfgCLI
+    from ats_utilities.cli import ATSCli
     from ats_utilities.console_io.error import error_message
     from ats_utilities.console_io.verbose import verbose_message
     from ats_utilities.console_io.success import success_message
@@ -82,7 +82,7 @@ 

Source code for gen_stm32

 __copyright__ = '(C) 2024, https://vroncevic.github.io/gen_stm32'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__ = 'https://github.com/vroncevic/gen_stm32/blob/dev/LICENSE'
-__version__ = '1.2.3'
+__version__ = '1.2.4'
 __maintainer__ = 'Vladimir Roncevic'
 __email__ = 'elektron.ronca@gmail.com'
 __status__ = 'Updated'
@@ -90,7 +90,7 @@ 

Source code for gen_stm32

 
 
[docs] -class GenSTM32(CfgCLI): +class GenSTM32(ATSCli): ''' Defines class GenSTM32 with attribute(s) and method(s). Loads a base info, creates a CLI interface and runs operations. @@ -136,9 +136,9 @@

Source code for gen_stm32

         super().__init__(base_info, verbose)
         verbose_message(verbose, [f'{self._GEN_VERBOSE} init tool info'])
         self._logger = ATSLogger(
-            self._GEN_VERBOSE.lower(), f'{current_dir}{self._LOG}', verbose
+            self._GEN_VERBOSE.lower(), True, None, True, verbose
         )
-        if self.tool_operational:
+        if self.is_operational():
             self.add_new_option(
                 self._OPS[0], self._OPS[1], dest='name',
                 help='generate STM32 project skeleton'
@@ -162,10 +162,10 @@ 

Source code for gen_stm32

             :exceptions: None
         '''
         status = False
-        if self.tool_operational:
+        if self.is_operational():
             try:
-                args: Any | Namespace = self.parse_args(sys.argv)
-                if not bool(getattr(args, "name")):
+                args: Optional[Namespace] = self.parse_args(sys.argv)
+                if not bool(getattr(args, 'name')):
                     error_message(
                         [f'{self._GEN_VERBOSE.lower()} missing name argument']
                     )
@@ -207,7 +207,7 @@ 

Source code for gen_stm32

                     )
             except SystemExit:
                 error_message(
-                    [f'{self._GEN_VERBOSE.lower()} expected argument -n']
+                    [f'{self._GEN_VERBOSE.lower()} expected argument name']
                 )
                 return status
         else:
diff --git a/docs/build/html/_modules/gen_stm32/pro.html b/docs/build/html/_modules/gen_stm32/pro.html
index 30025c4..5057751 100644
--- a/docs/build/html/_modules/gen_stm32/pro.html
+++ b/docs/build/html/_modules/gen_stm32/pro.html
@@ -60,7 +60,7 @@ 

Source code for gen_stm32.pro

 '''
 
 import sys
-from typing import List, Dict
+from typing import List, Dict, Optional
 from os.path import dirname, realpath
 
 try:
@@ -81,7 +81,7 @@ 

Source code for gen_stm32.pro

 __copyright__ = '(C) 2024, https://vroncevic.github.io/gen_stm32'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__ = 'https://github.com/vroncevic/gen_stm32/blob/dev/LICENSE'
-__version__ = '1.2.3'
+__version__ = '1.2.4'
 __maintainer__ = 'Vladimir Roncevic'
 __email__ = 'elektron.ronca@gmail.com'
 __status__ = 'Updated'
@@ -123,8 +123,8 @@ 

Source code for gen_stm32.pro

         ProConfig.__init__(self, verbose)
         ProName.__init__(self, verbose)
         verbose_message(verbose, [f'{self._GEN_VERBOSE} init generator'])
-        self._reader: ReadTemplate | None = ReadTemplate(verbose)
-        self._writer: WriteTemplate | None = WriteTemplate(verbose)
+        self._reader: Optional[ReadTemplate] = ReadTemplate(verbose)
+        self._writer: Optional[WriteTemplate] = WriteTemplate(verbose)
         current_dir: str = dirname(realpath(__file__))
         pro_structure: str = f'{current_dir}{self._PRO_STRUCTURE}'
         self.check_path(pro_structure, verbose)
@@ -136,12 +136,12 @@ 

Source code for gen_stm32.pro

 
 
[docs] - def get_reader(self) -> ReadTemplate | None: + def get_reader(self) -> Optional[ReadTemplate]: ''' Gets template reader. :return: Template reader object | None - :rtype: <ReadTemplate> | <NoneType> + :rtype: <Optional[ReadTemplate]> :exceptions: None ''' return self._reader
@@ -149,12 +149,12 @@

Source code for gen_stm32.pro

 
 
[docs] - def get_writer(self) -> WriteTemplate | None: + def get_writer(self) -> Optional[WriteTemplate]: ''' Gets template writer. :return: Template writer object | none - :rtype: <WriteTemplate> | <NoneType + :rtype: <Optional[WriteTemplate]> :exceptions: None ''' return self._writer
@@ -163,21 +163,21 @@

Source code for gen_stm32.pro

 
[docs] def gen_pro_setup( - self, pro_name: str | None, verbose: bool = False + self, pro_name: Optional[str], verbose: bool = False ) -> bool: ''' Generates STM32 project structure. :param pro_name: Project name | None - :type pro_name: <str> | <NoneType> + :type pro_name: <Optional[str]> :param verbose: Enable/Disable verbose option :type verbose: <bool> :return: True (success operation) | False :rtype: <bool> :exceptions: ATSBadCallError | ATSValueError ''' - error_msg: str | None = None - error_id: int | None = None + error_msg: Optional[str] = None + error_id: Optional[int] = None error_msg, error_id = self.check_params([ ('str:pro_name', pro_name) ]) diff --git a/docs/build/html/_modules/gen_stm32/pro/read_template.html b/docs/build/html/_modules/gen_stm32/pro/read_template.html index 1f3642b..fda9434 100644 --- a/docs/build/html/_modules/gen_stm32/pro/read_template.html +++ b/docs/build/html/_modules/gen_stm32/pro/read_template.html @@ -61,7 +61,7 @@

Source code for gen_stm32.pro.read_template

 '''
 
 import sys
-from typing import Any, List, Dict
+from typing import Any, List, Dict, Optional
 from os.path import isdir, dirname, realpath
 
 try:
@@ -79,7 +79,7 @@ 

Source code for gen_stm32.pro.read_template

 __copyright__ = '(C) 2024, https://vroncevic.github.io/gen_stm32'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__ = 'https://github.com/vroncevic/gen_stm32/blob/dev/LICENSE'
-__version__ = '1.2.3'
+__version__ = '1.2.4'
 __maintainer__ = 'Vladimir Roncevic'
 __email__ = 'elektron.ronca@gmail.com'
 __status__ = 'Updated'
@@ -137,8 +137,8 @@ 

Source code for gen_stm32.pro.read_template

             :rtype: <List[Dict[str, str]]>
             :exceptions: ATSTypeError | ATSValueError
         '''
-        error_msg: str | None = None
-        error_id: int | None = None
+        error_msg: Optional[str] = None
+        error_id: Optional[int] = None
         error_msg, error_id = self.check_params([('dict:config', config)])
         if error_id == self.TYPE_ERROR:
             raise ATSTypeError(error_msg)
diff --git a/docs/build/html/_modules/gen_stm32/pro/write_template.html b/docs/build/html/_modules/gen_stm32/pro/write_template.html
index 61c4eaa..546d44a 100644
--- a/docs/build/html/_modules/gen_stm32/pro/write_template.html
+++ b/docs/build/html/_modules/gen_stm32/pro/write_template.html
@@ -61,7 +61,7 @@ 

Source code for gen_stm32.pro.write_template

'''
 
 import sys
-from typing import List, Dict
+from typing import List, Dict, Optional
 from os import getcwd, chmod, makedirs
 from os.path import exists
 from string import Template
@@ -79,7 +79,7 @@ 

Source code for gen_stm32.pro.write_template

__copyright__ = '(C) 2024, https://vroncevic.github.io/gen_stm32'
 __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation']
 __license__ = 'https://github.com/vroncevic/gen_stm32/blob/dev/LICENSE'
-__version__ = '1.2.3'
+__version__ = '1.2.4'
 __maintainer__ = 'Vladimir Roncevic'
 __email__ = 'elektron.ronca@gmail.com'
 __status__ = 'Updated'
@@ -119,7 +119,7 @@ 

Source code for gen_stm32.pro.write_template

def write(
         self,
         templates: List[Dict[str, str]],
-        pro_name: str | None,
+        pro_name: Optional[str],
         verbose: bool = False
     ) -> bool:
         '''
@@ -128,15 +128,15 @@ 

Source code for gen_stm32.pro.write_template

            :param templates: Templates with params
             :type templates: <List[Dict[str, str]]>
             :param pro_name: Project name | None
-            :type pro_name: <str> | <NoneType>
+            :type pro_name: <Optional[str]>
             :param verbose: Enable/Disable verbose option
             :type verbose: <bool>
             :return: True (success operation) | False
             :rtype: <bool>
             :exceptions: ATSTypeError | ATSValueError
         '''
-        error_msg: str | None = None
-        error_id: int | None = None
+        error_msg: Optional[str] = None
+        error_id: Optional[int] = None
         error_msg, error_id = self.check_params([
             ('list:templates', templates), ('str:pro_name', pro_name)
         ])
diff --git a/docs/build/html/gen_stm32.html b/docs/build/html/gen_stm32.html
index dd85983..45fa6db 100644
--- a/docs/build/html/gen_stm32.html
+++ b/docs/build/html/gen_stm32.html
@@ -102,7 +102,7 @@ 

Subpackages
class gen_stm32.GenSTM32(verbose: bool = False)[source]
-

Bases: CfgCLI

+

Bases: ATSCli

Defines class GenSTM32 with attribute(s) and method(s). Loads a base info, creates a CLI interface and runs operations.

It defines:

diff --git a/docs/build/html/gen_stm32.pro.html b/docs/build/html/gen_stm32.pro.html index e94c6f8..844b948 100644 --- a/docs/build/html/gen_stm32.pro.html +++ b/docs/build/html/gen_stm32.pro.html @@ -136,7 +136,7 @@

Submodules
Parameters:
    -
  • pro_name (<str> | <NoneType>) – Project name | None

  • +
  • pro_name (<Optional[str]>) – Project name | None

  • verbose (<bool>) – Enable/Disable verbose option

@@ -161,7 +161,7 @@

Submodules

Template reader object | None

Return type:
-

<ReadTemplate> | <NoneType>

+

<Optional[ReadTemplate]>

Exceptions:

None

@@ -178,7 +178,7 @@

Submodules

Template writer object | none

Return type:
-

<WriteTemplate> | <NoneType

+

<Optional[WriteTemplate]>

Exceptions:

None

diff --git a/docs/build/html/gen_stm32.pro.write_template.html b/docs/build/html/gen_stm32.pro.write_template.html index 8ddaa9a..afb5beb 100644 --- a/docs/build/html/gen_stm32.pro.write_template.html +++ b/docs/build/html/gen_stm32.pro.write_template.html @@ -98,7 +98,7 @@

Navigation

Parameters:
  • templates (<List[Dict[str, str]]>) – Templates with params

  • -
  • pro_name (<str> | <NoneType>) – Project name | None

  • +
  • pro_name (<Optional[str]>) – Project name | None

  • verbose (<bool>) – Enable/Disable verbose option

diff --git a/docs/build/html/objects.inv b/docs/build/html/objects.inv index 9dce28c34ca6c699320691c4411082e5f982beec..2adb4a366989f91da08a2f4e4b0dc622b0d3d1c9 100644 GIT binary patch delta 12 TcmdnMvVmoSBcsVir+17195e(` delta 12 TcmdnMvVmoSBct&~r+17194`b= diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js index 7da95cd..cad01ab 100644 --- a/docs/build/html/searchindex.js +++ b/docs/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["gen_stm32", "gen_stm32.pro", "gen_stm32.pro.read_template", "gen_stm32.pro.write_template", "index", "modules"], "filenames": ["gen_stm32.rst", "gen_stm32.pro.rst", "gen_stm32.pro.read_template.rst", "gen_stm32.pro.write_template.rst", "index.rst", "modules.rst"], "titles": ["gen_stm32 package", "gen_stm32.pro package", "gen_stm32.pro.read_template module", "gen_stm32.pro.write_template module", "STM32 project skeleton generator", "gen_stm32"], "terms": {"pro": [0, 4, 5], "submodul": [0, 5], "read_templ": [0, 1, 4], "readtempl": [0, 1, 2], "write_templ": [0, 1, 4], "writetempl": [0, 1, 3], "stm32setup": [0, 1], "_gen_verbos": [0, 1, 2, 3, 5], "_pro_structur": [0, 1], "gen_pro_setup": [0, 1], "get_read": [0, 1], "get_writ": [0, 1], "__init__": [0, 1, 2, 3, 4], "py": [0, 1, 2, 3, 4], "copyright": [0, 1, 2, 3], "c": [0, 1, 2, 3, 4], "2018": [0, 1, 2, 3, 4], "2024": [0, 1, 2, 3, 4], "vladimir": [0, 1, 2, 3], "roncev": [0, 1, 2, 3], "elektron": [0, 1, 2, 3], "ronca": [0, 1, 2, 3], "gmail": [0, 1, 2, 3], "com": [0, 1, 2, 3], "i": [0, 1, 2, 3, 4], "free": [0, 1, 2, 3, 4], "softwar": [0, 1, 2, 3, 4], "you": [0, 1, 2, 3, 4], "can": [0, 1, 2, 3, 4], "redistribut": [0, 1, 2, 3, 4], "modifi": [0, 1, 2, 3, 4], "under": [0, 1, 2, 3, 4], "term": [0, 1, 2, 3, 4], "gnu": [0, 1, 2, 3], "gener": [0, 1, 2, 3], "public": [0, 1, 2, 3], "licens": [0, 1, 2, 3], "publish": [0, 1, 2, 3], "foundat": [0, 1, 2, 3], "either": [0, 1, 2, 3, 4], "version": [0, 1, 2, 3, 4], "3": [0, 1, 2, 3, 4], "your": [0, 1, 2, 3, 4], "option": [0, 1, 2, 3, 4], "ani": [0, 1, 2, 3, 4], "later": [0, 1, 2, 3, 4], "distribut": [0, 1, 2, 3], "hope": [0, 1, 2, 3], "us": [0, 1, 2, 3, 4], "without": [0, 1, 2, 3], "warranti": [0, 1, 2, 3], "even": [0, 1, 2, 3], "impli": [0, 1, 2, 3], "merchant": [0, 1, 2, 3], "fit": [0, 1, 2, 3], "FOR": [0, 1, 2, 3], "A": [0, 1, 2, 3], "particular": [0, 1, 2, 3], "purpos": [0, 1, 2, 3], "see": [0, 1, 2, 3], "more": [0, 1, 2, 3], "detail": [0, 1, 2, 3], "should": [0, 1, 2, 3, 4], "have": [0, 1, 2, 3, 4], "receiv": [0, 1, 2, 3], "copi": [0, 1, 2, 3], "along": [0, 1, 2, 3], "thi": [0, 1, 2, 3], "program": [0, 1, 2, 3], "If": [0, 1, 2, 3], "http": [0, 1, 2, 3, 4], "www": [0, 1, 2, 3], "org": [0, 1, 2, 3], "info": [0, 1, 2, 3], "defin": [0, 1, 2, 3], "class": [0, 1, 2, 3], "genstm32": [0, 4, 5], "attribut": [0, 1, 2, 3], "": [0, 1, 2, 3, 4], "method": [0, 1, 2, 3], "load": 0, "base": [0, 1, 2, 3, 4], "creat": [0, 1, 2, 3, 4], "cli": 0, "interfac": 0, "run": [0, 4], "oper": [0, 1, 3], "verbos": [0, 1, 2, 3], "bool": [0, 1, 2, 3], "fals": [0, 1, 2, 3], "sourc": [0, 1, 2, 3, 4], "cfgcli": 0, "It": [0, 1, 2, 3], "consol": [0, 1, 2, 3], "text": [0, 1, 2, 3], "indic": [0, 1, 2, 3], "process": [0, 1, 2, 3, 5], "phase": [0, 1, 2, 3], "_config": [0, 5], "configur": [0, 2], "file": [0, 2, 4], "path": [0, 2], "_log": [0, 5], "tool": 0, "log": [0, 4], "_logo": [0, 5], "logo": [0, 4], "splash": 0, "screen": 0, "_op": [0, 5], "list": [0, 2, 3], "_logger": 0, "logger": 0, "object": [0, 1, 4], "api": [0, 1, 2, 3], "initi": [0, 1, 2, 3], "constructor": [0, 1, 2, 3], "str": [0, 1, 2, 3], "conf": [0, 1, 2, 4], "cfg": [0, 4], "n": 0, "name": [0, 1, 3], "v": 0, "paramet": [0, 1, 2, 3], "enabl": [0, 1, 2, 3], "disabl": [0, 1, 2, 3], "return": [0, 1, 2, 3], "true": [0, 1, 3], "success": [0, 1, 3], "type": [0, 1, 2, 3, 4], "except": [0, 1, 2, 3], "none": [0, 1, 3, 4], "_template_dir": [1, 2], "read": [1, 2], "write": [1, 3], "an": [1, 2, 3], "stm32": 1, "project": [1, 2, 3], "skeleton": 1, "filecheck": [1, 2, 3], "proconfig": 1, "pronam": 1, "setup": 1, "templat": [1, 2, 3, 4], "_reader": 1, "reader": 1, "_writer": 1, "writer": 1, "get": [1, 4], "structur": 1, "yaml": [1, 4], "pro_nam": [1, 3], "nonetyp": [1, 3], "atsbadcallerror": 1, "atsvalueerror": [1, 2, 3], "templatedir": 2, "prefix": 2, "config": 2, "dict": [2, 3], "pico": 2, "content": [2, 5], "atstypeerror": [2, 3], "build": [3, 4], "param": 3, "gen_stm32": 4, "toolset": 4, "develop": 4, "embed": 4, "applic": 4, "python": 4, "code": 4, "The": 4, "readm": 4, "introduc": 4, "provid": 4, "instruct": 4, "how": 4, "machin": 4, "mai": 4, "other": 4, "inform": 4, "befor": 4, "packag": [4, 5], "subpackag": [4, 5], "modul": [4, 5], "navig": 4, "releas": 4, "page": 4, "download": 4, "extract": 4, "archiv": 4, "To": 4, "follow": 4, "tar": 4, "xvzf": 4, "x": 4, "y": 4, "z": 4, "gz": 4, "cd": 4, "python3": 4, "wget": 4, "bootstrap": 4, "pypa": 4, "io": 4, "pip": 4, "m": 4, "upgrad": 4, "setuptool": 4, "pip3": 4, "r": 4, "requir": 4, "txt": 4, "isol": 4, "wheel": 4, "dist": 4, "py3": 4, "whl": 4, "rm": 4, "f": 4, "chmod": 4, "755": 4, "usr": 4, "local": 4, "lib": 4, "10": 4, "bin": 4, "gen_stm32_run": 4, "ln": 4, "docker": 4, "imag": 4, "contain": 4, "pyton3": 4, "gen": 4, "next": 4, "librari": 4, "ats": 4, "util": 4, "app": 4, "script": 4, "oop": 4, "gen_stm32_util": 4, "includ": 4, "stm32f4xx_stdperiph_driv": 4, "src": 4, "subdir": 4, "makefil": 4, "cmsi": 4, "arm_common_t": 4, "arm_math": 4, "core_cm0": 4, "core_cm3": 4, "core_cm4_simd": 4, "core_cm4": 4, "core_cmfunc": 4, "core_cminstr": 4, "stm32f4xx": 4, "stm32f4xx_conf": 4, "system_stm32f4xx": 4, "inc": 4, "misc": 4, "stm32f4xx_adc": 4, "stm32f4xx_can": 4, "stm32f4xx_crc": 4, "stm32f4xx_cryp": 4, "stm32f4xx_dac": 4, "stm32f4xx_dbgmcu": 4, "stm32f4xx_dcmi": 4, "stm32f4xx_dma": 4, "stm32f4xx_exti": 4, "stm32f4xx_flash": 4, "stm32f4xx_fsmc": 4, "stm32f4xx_gpio": 4, "stm32f4xx_hash": 4, "stm32f4xx_i2c": 4, "stm32f4xx_iwdg": 4, "stm32f4xx_pwr": 4, "stm32f4xx_rcc": 4, "stm32f4xx_rng": 4, "stm32f4xx_rtc": 4, "stm32f4xx_sdio": 4, "stm32f4xx_spi": 4, "stm32f4xx_syscfg": 4, "stm32f4xx_tim": 4, "stm32f4xx_usart": 4, "stm32f4xx_wwdg": 4, "stm32f4xx_cryp_a": 4, "stm32f4xx_cryp_d": 4, "stm32f4xx_cryp_td": 4, "stm32f4xx_hash_md5": 4, "stm32f4xx_hash_sha1": 4, "arm_cortex_m4_512": 4, "main": 4, "startup_stm32f4xx": 4, "syscal": 4, "tinynew": 4, "19": 4, "directori": 4, "89": 4, "vroncev": 4, "github": 4, "same": 4, "itself": 4, "avail": 4, "let": 4, "help": 4, "support": 4, "psf": 4, "index": 4, "search": 4}, "objects": {"": [[0, 0, 0, "-", "gen_stm32"]], "gen_stm32": [[0, 1, 1, "", "GenSTM32"], [1, 0, 0, "-", "pro"]], "gen_stm32.GenSTM32": [[0, 2, 1, "", "_CONFIG"], [0, 2, 1, "", "_GEN_VERBOSE"], [0, 2, 1, "", "_LOG"], [0, 2, 1, "", "_LOGO"], [0, 2, 1, "", "_OPS"], [0, 3, 1, "", "process"]], "gen_stm32.pro": [[1, 1, 1, "", "STM32Setup"], [2, 0, 0, "-", "read_template"], [3, 0, 0, "-", "write_template"]], "gen_stm32.pro.STM32Setup": [[1, 2, 1, "", "_GEN_VERBOSE"], [1, 2, 1, "", "_PRO_STRUCTURE"], [1, 3, 1, "", "gen_pro_setup"], [1, 3, 1, "", "get_reader"], [1, 3, 1, "", "get_writer"]], "gen_stm32.pro.read_template": [[2, 1, 1, "", "ReadTemplate"]], "gen_stm32.pro.read_template.ReadTemplate": [[2, 2, 1, "", "_GEN_VERBOSE"], [2, 2, 1, "", "_TEMPLATE_DIR"], [2, 3, 1, "", "read"]], "gen_stm32.pro.write_template": [[3, 1, 1, "", "WriteTemplate"]], "gen_stm32.pro.write_template.WriteTemplate": [[3, 2, 1, "", "_GEN_VERBOSE"], [3, 3, 1, "", "write"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:method"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "method", "Python method"]}, "titleterms": {"gen_stm32": [0, 1, 2, 3, 5], "packag": [0, 1], "subpackag": 0, "modul": [0, 1, 2, 3], "content": [0, 1, 4], "pro": [1, 2, 3], "submodul": 1, "read_templ": 2, "write_templ": 3, "stm32": 4, "project": 4, "skeleton": 4, "gener": 4, "instal": 4, "depend": 4, "tool": 4, "structur": 4, "copyright": 4, "licenc": 4, "indic": 4, "tabl": 4}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"gen_stm32 package": [[0, "gen-stm32-package"]], "Subpackages": [[0, "subpackages"]], "Module contents": [[0, "module-gen_stm32"], [1, "module-gen_stm32.pro"]], "gen_stm32.pro package": [[1, "gen-stm32-pro-package"]], "Submodules": [[1, "submodules"]], "gen_stm32.pro.read_template module": [[2, "module-gen_stm32.pro.read_template"]], "gen_stm32.pro.write_template module": [[3, "module-gen_stm32.pro.write_template"]], "STM32 project skeleton generator": [[4, "stm32-project-skeleton-generator"]], "Contents": [[4, null]], "Installation": [[4, "installation"]], "Dependencies": [[4, "dependencies"]], "Tool structure": [[4, "tool-structure"]], "Copyright and licence": [[4, "copyright-and-licence"]], "Indices and tables": [[4, "indices-and-tables"]], "gen_stm32": [[5, "gen-stm32"]]}, "indexentries": {"genstm32 (class in gen_stm32)": [[0, "gen_stm32.GenSTM32"]], "_config (gen_stm32.genstm32 attribute)": [[0, "gen_stm32.GenSTM32._CONFIG"]], "_gen_verbose (gen_stm32.genstm32 attribute)": [[0, "gen_stm32.GenSTM32._GEN_VERBOSE"]], "_log (gen_stm32.genstm32 attribute)": [[0, "gen_stm32.GenSTM32._LOG"]], "_logo (gen_stm32.genstm32 attribute)": [[0, "gen_stm32.GenSTM32._LOGO"]], "_ops (gen_stm32.genstm32 attribute)": [[0, "gen_stm32.GenSTM32._OPS"]], "gen_stm32": [[0, "module-gen_stm32"]], "module": [[0, "module-gen_stm32"], [1, "module-gen_stm32.pro"], [2, "module-gen_stm32.pro.read_template"], [3, "module-gen_stm32.pro.write_template"]], "process() (gen_stm32.genstm32 method)": [[0, "gen_stm32.GenSTM32.process"]], "stm32setup (class in gen_stm32.pro)": [[1, "gen_stm32.pro.STM32Setup"]], "_gen_verbose (gen_stm32.pro.stm32setup attribute)": [[1, "gen_stm32.pro.STM32Setup._GEN_VERBOSE"]], "_pro_structure (gen_stm32.pro.stm32setup attribute)": [[1, "gen_stm32.pro.STM32Setup._PRO_STRUCTURE"]], "gen_pro_setup() (gen_stm32.pro.stm32setup method)": [[1, "gen_stm32.pro.STM32Setup.gen_pro_setup"]], "gen_stm32.pro": [[1, "module-gen_stm32.pro"]], "get_reader() (gen_stm32.pro.stm32setup method)": [[1, "gen_stm32.pro.STM32Setup.get_reader"]], "get_writer() (gen_stm32.pro.stm32setup method)": [[1, "gen_stm32.pro.STM32Setup.get_writer"]], "readtemplate (class in gen_stm32.pro.read_template)": [[2, "gen_stm32.pro.read_template.ReadTemplate"]], "_gen_verbose (gen_stm32.pro.read_template.readtemplate attribute)": [[2, "gen_stm32.pro.read_template.ReadTemplate._GEN_VERBOSE"]], "_template_dir (gen_stm32.pro.read_template.readtemplate attribute)": [[2, "gen_stm32.pro.read_template.ReadTemplate._TEMPLATE_DIR"]], "gen_stm32.pro.read_template": [[2, "module-gen_stm32.pro.read_template"]], "read() (gen_stm32.pro.read_template.readtemplate method)": [[2, "gen_stm32.pro.read_template.ReadTemplate.read"]], "writetemplate (class in gen_stm32.pro.write_template)": [[3, "gen_stm32.pro.write_template.WriteTemplate"]], "_gen_verbose (gen_stm32.pro.write_template.writetemplate attribute)": [[3, "gen_stm32.pro.write_template.WriteTemplate._GEN_VERBOSE"]], "gen_stm32.pro.write_template": [[3, "module-gen_stm32.pro.write_template"]], "write() (gen_stm32.pro.write_template.writetemplate method)": [[3, "gen_stm32.pro.write_template.WriteTemplate.write"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["gen_stm32", "gen_stm32.pro", "gen_stm32.pro.read_template", "gen_stm32.pro.write_template", "index", "modules"], "filenames": ["gen_stm32.rst", "gen_stm32.pro.rst", "gen_stm32.pro.read_template.rst", "gen_stm32.pro.write_template.rst", "index.rst", "modules.rst"], "titles": ["gen_stm32 package", "gen_stm32.pro package", "gen_stm32.pro.read_template module", "gen_stm32.pro.write_template module", "STM32 project skeleton generator", "gen_stm32"], "terms": {"pro": [0, 4, 5], "submodul": [0, 5], "read_templ": [0, 1, 4], "readtempl": [0, 1, 2], "write_templ": [0, 1, 4], "writetempl": [0, 1, 3], "stm32setup": [0, 1], "_gen_verbos": [0, 1, 2, 3, 5], "_pro_structur": [0, 1], "gen_pro_setup": [0, 1], "get_read": [0, 1], "get_writ": [0, 1], "__init__": [0, 1, 2, 3, 4], "py": [0, 1, 2, 3, 4], "copyright": [0, 1, 2, 3], "c": [0, 1, 2, 3, 4], "2018": [0, 1, 2, 3, 4], "2024": [0, 1, 2, 3, 4], "vladimir": [0, 1, 2, 3], "roncev": [0, 1, 2, 3], "elektron": [0, 1, 2, 3], "ronca": [0, 1, 2, 3], "gmail": [0, 1, 2, 3], "com": [0, 1, 2, 3], "i": [0, 1, 2, 3, 4], "free": [0, 1, 2, 3, 4], "softwar": [0, 1, 2, 3, 4], "you": [0, 1, 2, 3, 4], "can": [0, 1, 2, 3, 4], "redistribut": [0, 1, 2, 3, 4], "modifi": [0, 1, 2, 3, 4], "under": [0, 1, 2, 3, 4], "term": [0, 1, 2, 3, 4], "gnu": [0, 1, 2, 3], "gener": [0, 1, 2, 3], "public": [0, 1, 2, 3], "licens": [0, 1, 2, 3], "publish": [0, 1, 2, 3], "foundat": [0, 1, 2, 3], "either": [0, 1, 2, 3, 4], "version": [0, 1, 2, 3, 4], "3": [0, 1, 2, 3, 4], "your": [0, 1, 2, 3, 4], "option": [0, 1, 2, 3, 4], "ani": [0, 1, 2, 3, 4], "later": [0, 1, 2, 3, 4], "distribut": [0, 1, 2, 3], "hope": [0, 1, 2, 3], "us": [0, 1, 2, 3, 4], "without": [0, 1, 2, 3], "warranti": [0, 1, 2, 3], "even": [0, 1, 2, 3], "impli": [0, 1, 2, 3], "merchant": [0, 1, 2, 3], "fit": [0, 1, 2, 3], "FOR": [0, 1, 2, 3], "A": [0, 1, 2, 3], "particular": [0, 1, 2, 3], "purpos": [0, 1, 2, 3], "see": [0, 1, 2, 3], "more": [0, 1, 2, 3], "detail": [0, 1, 2, 3], "should": [0, 1, 2, 3, 4], "have": [0, 1, 2, 3, 4], "receiv": [0, 1, 2, 3], "copi": [0, 1, 2, 3], "along": [0, 1, 2, 3], "thi": [0, 1, 2, 3], "program": [0, 1, 2, 3], "If": [0, 1, 2, 3], "http": [0, 1, 2, 3, 4], "www": [0, 1, 2, 3], "org": [0, 1, 2, 3], "info": [0, 1, 2, 3], "defin": [0, 1, 2, 3], "class": [0, 1, 2, 3], "genstm32": [0, 4, 5], "attribut": [0, 1, 2, 3], "": [0, 1, 2, 3, 4], "method": [0, 1, 2, 3], "load": 0, "base": [0, 1, 2, 3, 4], "creat": [0, 1, 2, 3, 4], "cli": 0, "interfac": 0, "run": [0, 4], "oper": [0, 1, 3], "verbos": [0, 1, 2, 3], "bool": [0, 1, 2, 3], "fals": [0, 1, 2, 3], "sourc": [0, 1, 2, 3, 4], "atscli": 0, "It": [0, 1, 2, 3], "consol": [0, 1, 2, 3], "text": [0, 1, 2, 3], "indic": [0, 1, 2, 3], "process": [0, 1, 2, 3, 5], "phase": [0, 1, 2, 3], "_config": [0, 5], "configur": [0, 2], "file": [0, 2, 4], "path": [0, 2], "_log": [0, 5], "tool": 0, "log": [0, 4], "_logo": [0, 5], "logo": [0, 4], "splash": 0, "screen": 0, "_op": [0, 5], "list": [0, 2, 3], "_logger": 0, "logger": 0, "object": [0, 1, 4], "api": [0, 1, 2, 3], "initi": [0, 1, 2, 3], "constructor": [0, 1, 2, 3], "str": [0, 1, 2, 3], "conf": [0, 1, 2, 4], "cfg": [0, 4], "n": 0, "name": [0, 1, 3], "v": 0, "paramet": [0, 1, 2, 3], "enabl": [0, 1, 2, 3], "disabl": [0, 1, 2, 3], "return": [0, 1, 2, 3], "true": [0, 1, 3], "success": [0, 1, 3], "type": [0, 1, 2, 3, 4], "except": [0, 1, 2, 3], "none": [0, 1, 3, 4], "_template_dir": [1, 2], "read": [1, 2], "write": [1, 3], "an": [1, 2, 3], "stm32": 1, "project": [1, 2, 3], "skeleton": 1, "filecheck": [1, 2, 3], "proconfig": 1, "pronam": 1, "setup": 1, "templat": [1, 2, 3, 4], "_reader": 1, "reader": 1, "_writer": 1, "writer": 1, "get": [1, 4], "structur": 1, "yaml": [1, 4], "pro_nam": [1, 3], "atsbadcallerror": 1, "atsvalueerror": [1, 2, 3], "templatedir": 2, "prefix": 2, "config": 2, "dict": [2, 3], "pico": 2, "content": [2, 5], "atstypeerror": [2, 3], "build": [3, 4], "param": 3, "gen_stm32": 4, "toolset": 4, "develop": 4, "embed": 4, "applic": 4, "python": 4, "code": 4, "The": 4, "readm": 4, "introduc": 4, "provid": 4, "instruct": 4, "how": 4, "machin": 4, "mai": 4, "other": 4, "inform": 4, "befor": 4, "packag": [4, 5], "subpackag": [4, 5], "modul": [4, 5], "navig": 4, "releas": 4, "page": 4, "download": 4, "extract": 4, "archiv": 4, "To": 4, "follow": 4, "tar": 4, "xvzf": 4, "x": 4, "y": 4, "z": 4, "gz": 4, "cd": 4, "python3": 4, "wget": 4, "bootstrap": 4, "pypa": 4, "io": 4, "pip": 4, "m": 4, "upgrad": 4, "setuptool": 4, "pip3": 4, "r": 4, "requir": 4, "txt": 4, "isol": 4, "wheel": 4, "dist": 4, "py3": 4, "whl": 4, "rm": 4, "f": 4, "chmod": 4, "755": 4, "usr": 4, "local": 4, "lib": 4, "10": 4, "bin": 4, "gen_stm32_run": 4, "ln": 4, "docker": 4, "imag": 4, "contain": 4, "pyton3": 4, "gen": 4, "next": 4, "librari": 4, "ats": 4, "util": 4, "app": 4, "script": 4, "oop": 4, "gen_stm32_util": 4, "includ": 4, "stm32f4xx_stdperiph_driv": 4, "src": 4, "subdir": 4, "makefil": 4, "cmsi": 4, "arm_common_t": 4, "arm_math": 4, "core_cm0": 4, "core_cm3": 4, "core_cm4_simd": 4, "core_cm4": 4, "core_cmfunc": 4, "core_cminstr": 4, "stm32f4xx": 4, "stm32f4xx_conf": 4, "system_stm32f4xx": 4, "inc": 4, "misc": 4, "stm32f4xx_adc": 4, "stm32f4xx_can": 4, "stm32f4xx_crc": 4, "stm32f4xx_cryp": 4, "stm32f4xx_dac": 4, "stm32f4xx_dbgmcu": 4, "stm32f4xx_dcmi": 4, "stm32f4xx_dma": 4, "stm32f4xx_exti": 4, "stm32f4xx_flash": 4, "stm32f4xx_fsmc": 4, "stm32f4xx_gpio": 4, "stm32f4xx_hash": 4, "stm32f4xx_i2c": 4, "stm32f4xx_iwdg": 4, "stm32f4xx_pwr": 4, "stm32f4xx_rcc": 4, "stm32f4xx_rng": 4, "stm32f4xx_rtc": 4, "stm32f4xx_sdio": 4, "stm32f4xx_spi": 4, "stm32f4xx_syscfg": 4, "stm32f4xx_tim": 4, "stm32f4xx_usart": 4, "stm32f4xx_wwdg": 4, "stm32f4xx_cryp_a": 4, "stm32f4xx_cryp_d": 4, "stm32f4xx_cryp_td": 4, "stm32f4xx_hash_md5": 4, "stm32f4xx_hash_sha1": 4, "arm_cortex_m4_512": 4, "main": 4, "startup_stm32f4xx": 4, "syscal": 4, "tinynew": 4, "19": 4, "directori": 4, "89": 4, "vroncev": 4, "github": 4, "same": 4, "itself": 4, "avail": 4, "let": 4, "help": 4, "support": 4, "psf": 4, "index": 4, "search": 4}, "objects": {"": [[0, 0, 0, "-", "gen_stm32"]], "gen_stm32": [[0, 1, 1, "", "GenSTM32"], [1, 0, 0, "-", "pro"]], "gen_stm32.GenSTM32": [[0, 2, 1, "", "_CONFIG"], [0, 2, 1, "", "_GEN_VERBOSE"], [0, 2, 1, "", "_LOG"], [0, 2, 1, "", "_LOGO"], [0, 2, 1, "", "_OPS"], [0, 3, 1, "", "process"]], "gen_stm32.pro": [[1, 1, 1, "", "STM32Setup"], [2, 0, 0, "-", "read_template"], [3, 0, 0, "-", "write_template"]], "gen_stm32.pro.STM32Setup": [[1, 2, 1, "", "_GEN_VERBOSE"], [1, 2, 1, "", "_PRO_STRUCTURE"], [1, 3, 1, "", "gen_pro_setup"], [1, 3, 1, "", "get_reader"], [1, 3, 1, "", "get_writer"]], "gen_stm32.pro.read_template": [[2, 1, 1, "", "ReadTemplate"]], "gen_stm32.pro.read_template.ReadTemplate": [[2, 2, 1, "", "_GEN_VERBOSE"], [2, 2, 1, "", "_TEMPLATE_DIR"], [2, 3, 1, "", "read"]], "gen_stm32.pro.write_template": [[3, 1, 1, "", "WriteTemplate"]], "gen_stm32.pro.write_template.WriteTemplate": [[3, 2, 1, "", "_GEN_VERBOSE"], [3, 3, 1, "", "write"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:method"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "method", "Python method"]}, "titleterms": {"gen_stm32": [0, 1, 2, 3, 5], "packag": [0, 1], "subpackag": 0, "modul": [0, 1, 2, 3], "content": [0, 1, 4], "pro": [1, 2, 3], "submodul": 1, "read_templ": 2, "write_templ": 3, "stm32": 4, "project": 4, "skeleton": 4, "gener": 4, "instal": 4, "depend": 4, "tool": 4, "structur": 4, "copyright": 4, "licenc": 4, "indic": 4, "tabl": 4}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"gen_stm32 package": [[0, "gen-stm32-package"]], "Subpackages": [[0, "subpackages"]], "Module contents": [[0, "module-gen_stm32"], [1, "module-gen_stm32.pro"]], "gen_stm32.pro package": [[1, "gen-stm32-pro-package"]], "Submodules": [[1, "submodules"]], "gen_stm32.pro.read_template module": [[2, "module-gen_stm32.pro.read_template"]], "gen_stm32.pro.write_template module": [[3, "module-gen_stm32.pro.write_template"]], "STM32 project skeleton generator": [[4, "stm32-project-skeleton-generator"]], "Contents": [[4, null]], "Installation": [[4, "installation"]], "Dependencies": [[4, "dependencies"]], "Tool structure": [[4, "tool-structure"]], "Copyright and licence": [[4, "copyright-and-licence"]], "Indices and tables": [[4, "indices-and-tables"]], "gen_stm32": [[5, "gen-stm32"]]}, "indexentries": {"genstm32 (class in gen_stm32)": [[0, "gen_stm32.GenSTM32"]], "_config (gen_stm32.genstm32 attribute)": [[0, "gen_stm32.GenSTM32._CONFIG"]], "_gen_verbose (gen_stm32.genstm32 attribute)": [[0, "gen_stm32.GenSTM32._GEN_VERBOSE"]], "_log (gen_stm32.genstm32 attribute)": [[0, "gen_stm32.GenSTM32._LOG"]], "_logo (gen_stm32.genstm32 attribute)": [[0, "gen_stm32.GenSTM32._LOGO"]], "_ops (gen_stm32.genstm32 attribute)": [[0, "gen_stm32.GenSTM32._OPS"]], "gen_stm32": [[0, "module-gen_stm32"]], "module": [[0, "module-gen_stm32"], [1, "module-gen_stm32.pro"], [2, "module-gen_stm32.pro.read_template"], [3, "module-gen_stm32.pro.write_template"]], "process() (gen_stm32.genstm32 method)": [[0, "gen_stm32.GenSTM32.process"]], "stm32setup (class in gen_stm32.pro)": [[1, "gen_stm32.pro.STM32Setup"]], "_gen_verbose (gen_stm32.pro.stm32setup attribute)": [[1, "gen_stm32.pro.STM32Setup._GEN_VERBOSE"]], "_pro_structure (gen_stm32.pro.stm32setup attribute)": [[1, "gen_stm32.pro.STM32Setup._PRO_STRUCTURE"]], "gen_pro_setup() (gen_stm32.pro.stm32setup method)": [[1, "gen_stm32.pro.STM32Setup.gen_pro_setup"]], "gen_stm32.pro": [[1, "module-gen_stm32.pro"]], "get_reader() (gen_stm32.pro.stm32setup method)": [[1, "gen_stm32.pro.STM32Setup.get_reader"]], "get_writer() (gen_stm32.pro.stm32setup method)": [[1, "gen_stm32.pro.STM32Setup.get_writer"]], "readtemplate (class in gen_stm32.pro.read_template)": [[2, "gen_stm32.pro.read_template.ReadTemplate"]], "_gen_verbose (gen_stm32.pro.read_template.readtemplate attribute)": [[2, "gen_stm32.pro.read_template.ReadTemplate._GEN_VERBOSE"]], "_template_dir (gen_stm32.pro.read_template.readtemplate attribute)": [[2, "gen_stm32.pro.read_template.ReadTemplate._TEMPLATE_DIR"]], "gen_stm32.pro.read_template": [[2, "module-gen_stm32.pro.read_template"]], "read() (gen_stm32.pro.read_template.readtemplate method)": [[2, "gen_stm32.pro.read_template.ReadTemplate.read"]], "writetemplate (class in gen_stm32.pro.write_template)": [[3, "gen_stm32.pro.write_template.WriteTemplate"]], "_gen_verbose (gen_stm32.pro.write_template.writetemplate attribute)": [[3, "gen_stm32.pro.write_template.WriteTemplate._GEN_VERBOSE"]], "gen_stm32.pro.write_template": [[3, "module-gen_stm32.pro.write_template"]], "write() (gen_stm32.pro.write_template.writetemplate method)": [[3, "gen_stm32.pro.write_template.WriteTemplate.write"]]}}) \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py index d898d27..2208076 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -29,7 +29,7 @@ project: str = 'gen_stm32' project_copyright: str = '2024, Vladimir Roncevic ' author: str = 'Vladimir Roncevic ' -version: str = '1.2.3' +version: str = '1.2.4' release: str = 'https://github.com/vroncevic/gen_stm32/releases' extensions: List[str] = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode'] templates_path: List[str] = ['_templates'] diff --git a/gen_stm32/.editorconfig b/gen_stm32/.editorconfig index e856098..f228d58 100644 --- a/gen_stm32/.editorconfig +++ b/gen_stm32/.editorconfig @@ -1,3 +1,3 @@ [**.py] indent_style = tab -tab_width = 4 +tab_width = 4 \ No newline at end of file diff --git a/gen_stm32/__init__.py b/gen_stm32/__init__.py index b45143f..ded833d 100644 --- a/gen_stm32/__init__.py +++ b/gen_stm32/__init__.py @@ -21,7 +21,7 @@ ''' import sys -from typing import Any, List, Dict +from typing import List, Dict, Optional from os.path import exists, dirname, realpath from os import getcwd from argparse import Namespace @@ -29,7 +29,7 @@ try: from ats_utilities.splash import Splash from ats_utilities.logging import ATSLogger - from ats_utilities.cli.cfg_cli import CfgCLI + from ats_utilities.cli import ATSCli from ats_utilities.console_io.error import error_message from ats_utilities.console_io.verbose import verbose_message from ats_utilities.console_io.success import success_message @@ -44,13 +44,13 @@ __copyright__ = '(C) 2024, https://vroncevic.github.io/gen_stm32' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__ = 'https://github.com/vroncevic/gen_stm32/blob/dev/LICENSE' -__version__ = '1.2.3' +__version__ = '1.2.4' __maintainer__ = 'Vladimir Roncevic' __email__ = 'elektron.ronca@gmail.com' __status__ = 'Updated' -class GenSTM32(CfgCLI): +class GenSTM32(ATSCli): ''' Defines class GenSTM32 with attribute(s) and method(s). Loads a base info, creates a CLI interface and runs operations. @@ -96,9 +96,9 @@ def __init__(self, verbose: bool = False) -> None: super().__init__(base_info, verbose) verbose_message(verbose, [f'{self._GEN_VERBOSE} init tool info']) self._logger = ATSLogger( - self._GEN_VERBOSE.lower(), f'{current_dir}{self._LOG}', verbose + self._GEN_VERBOSE.lower(), True, None, True, verbose ) - if self.tool_operational: + if self.is_operational(): self.add_new_option( self._OPS[0], self._OPS[1], dest='name', help='generate STM32 project skeleton' @@ -120,10 +120,10 @@ def process(self, verbose: bool = False) -> bool: :exceptions: None ''' status = False - if self.tool_operational: + if self.is_operational(): try: - args: Any | Namespace = self.parse_args(sys.argv) - if not bool(getattr(args, "name")): + args: Optional[Namespace] = self.parse_args(sys.argv) + if not bool(getattr(args, 'name')): error_message( [f'{self._GEN_VERBOSE.lower()} missing name argument'] ) @@ -165,7 +165,7 @@ def process(self, verbose: bool = False) -> bool: ) except SystemExit: error_message( - [f'{self._GEN_VERBOSE.lower()} expected argument -n'] + [f'{self._GEN_VERBOSE.lower()} expected argument name'] ) return status else: diff --git a/gen_stm32/conf/gen_stm32.cfg b/gen_stm32/conf/gen_stm32.cfg index fcfbc08..f318b47 100644 --- a/gen_stm32/conf/gen_stm32.cfg +++ b/gen_stm32/conf/gen_stm32.cfg @@ -1,4 +1,4 @@ ats_name = gen_stm32 -ats_version = 1.2.3 +ats_version = 1.2.4 ats_build_date = 26 May 2021 ats_licence = https://github.com/vroncevic/gen_stm32/blob/dev/LICENSE diff --git a/gen_stm32/log/gen_stm32.log b/gen_stm32/log/gen_stm32.log index e1b12fa..e69de29 100644 --- a/gen_stm32/log/gen_stm32.log +++ b/gen_stm32/log/gen_stm32.log @@ -1,2 +0,0 @@ -06/13/2024 10:18:22 PM - INFO - generation project latest done -06/13/2024 10:18:24 PM - ERROR - tool is not operational diff --git a/gen_stm32/pro/__init__.py b/gen_stm32/pro/__init__.py index 60c4a23..b14ad36 100644 --- a/gen_stm32/pro/__init__.py +++ b/gen_stm32/pro/__init__.py @@ -21,7 +21,7 @@ ''' import sys -from typing import List, Dict +from typing import List, Dict, Optional from os.path import dirname, realpath try: @@ -42,7 +42,7 @@ __copyright__ = '(C) 2024, https://vroncevic.github.io/gen_stm32' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__ = 'https://github.com/vroncevic/gen_stm32/blob/dev/LICENSE' -__version__ = '1.2.3' +__version__ = '1.2.4' __maintainer__ = 'Vladimir Roncevic' __email__ = 'elektron.ronca@gmail.com' __status__ = 'Updated' @@ -82,8 +82,8 @@ def __init__(self, verbose: bool = False) -> None: ProConfig.__init__(self, verbose) ProName.__init__(self, verbose) verbose_message(verbose, [f'{self._GEN_VERBOSE} init generator']) - self._reader: ReadTemplate | None = ReadTemplate(verbose) - self._writer: WriteTemplate | None = WriteTemplate(verbose) + self._reader: Optional[ReadTemplate] = ReadTemplate(verbose) + self._writer: Optional[WriteTemplate] = WriteTemplate(verbose) current_dir: str = dirname(realpath(__file__)) pro_structure: str = f'{current_dir}{self._PRO_STRUCTURE}' self.check_path(pro_structure, verbose) @@ -93,42 +93,42 @@ def __init__(self, verbose: bool = False) -> None: yml2obj = Yaml2Object(pro_structure) self.config = yml2obj.read_configuration() - def get_reader(self) -> ReadTemplate | None: + def get_reader(self) -> Optional[ReadTemplate]: ''' Gets template reader. :return: Template reader object | None - :rtype: | + :rtype: :exceptions: None ''' return self._reader - def get_writer(self) -> WriteTemplate | None: + def get_writer(self) -> Optional[WriteTemplate]: ''' Gets template writer. :return: Template writer object | none - :rtype: | :exceptions: None ''' return self._writer def gen_pro_setup( - self, pro_name: str | None, verbose: bool = False + self, pro_name: Optional[str], verbose: bool = False ) -> bool: ''' Generates STM32 project structure. :param pro_name: Project name | None - :type pro_name: | + :type pro_name: :param verbose: Enable/Disable verbose option :type verbose: :return: True (success operation) | False :rtype: :exceptions: ATSBadCallError | ATSValueError ''' - error_msg: str | None = None - error_id: int | None = None + error_msg: Optional[str] = None + error_id: Optional[int] = None error_msg, error_id = self.check_params([ ('str:pro_name', pro_name) ]) diff --git a/gen_stm32/pro/read_template.py b/gen_stm32/pro/read_template.py index 34bb9ff..5dfe71d 100644 --- a/gen_stm32/pro/read_template.py +++ b/gen_stm32/pro/read_template.py @@ -21,7 +21,7 @@ ''' import sys -from typing import Any, List, Dict +from typing import Any, List, Dict, Optional from os.path import isdir, dirname, realpath try: @@ -39,7 +39,7 @@ __copyright__ = '(C) 2024, https://vroncevic.github.io/gen_stm32' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__ = 'https://github.com/vroncevic/gen_stm32/blob/dev/LICENSE' -__version__ = '1.2.3' +__version__ = '1.2.4' __maintainer__ = 'Vladimir Roncevic' __email__ = 'elektron.ronca@gmail.com' __status__ = 'Updated' @@ -93,8 +93,8 @@ def read( :rtype: :exceptions: ATSTypeError | ATSValueError ''' - error_msg: str | None = None - error_id: int | None = None + error_msg: Optional[str] = None + error_id: Optional[int] = None error_msg, error_id = self.check_params([('dict:config', config)]) if error_id == self.TYPE_ERROR: raise ATSTypeError(error_msg) diff --git a/gen_stm32/pro/write_template.py b/gen_stm32/pro/write_template.py index db92e0a..5a2aae4 100644 --- a/gen_stm32/pro/write_template.py +++ b/gen_stm32/pro/write_template.py @@ -21,7 +21,7 @@ ''' import sys -from typing import List, Dict +from typing import List, Dict, Optional from os import getcwd, chmod, makedirs from os.path import exists from string import Template @@ -39,7 +39,7 @@ __copyright__ = '(C) 2024, https://vroncevic.github.io/gen_stm32' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__ = 'https://github.com/vroncevic/gen_stm32/blob/dev/LICENSE' -__version__ = '1.2.3' +__version__ = '1.2.4' __maintainer__ = 'Vladimir Roncevic' __email__ = 'elektron.ronca@gmail.com' __status__ = 'Updated' @@ -75,7 +75,7 @@ def __init__(self, verbose: bool = False) -> None: def write( self, templates: List[Dict[str, str]], - pro_name: str | None, + pro_name: Optional[str], verbose: bool = False ) -> bool: ''' @@ -84,15 +84,15 @@ def write( :param templates: Templates with params :type templates: :param pro_name: Project name | None - :type pro_name: | + :type pro_name: :param verbose: Enable/Disable verbose option :type verbose: :return: True (success operation) | False :rtype: :exceptions: ATSTypeError | ATSValueError ''' - error_msg: str | None = None - error_id: int | None = None + error_msg: Optional[str] = None + error_id: Optional[int] = None error_msg, error_id = self.check_params([ ('list:templates', templates), ('str:pro_name', pro_name) ]) diff --git a/gen_stm32/run/gen_stm32_run.py b/gen_stm32/run/gen_stm32_run.py index a3f9543..0ca8b5d 100644 --- a/gen_stm32/run/gen_stm32_run.py +++ b/gen_stm32/run/gen_stm32_run.py @@ -33,7 +33,7 @@ __copyright__ = '(C) 2024, https://vroncevic.github.io/gen_stm32' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__ = 'https://github.com/vroncevic/gen_stm32/blob/dev/LICENSE' -__version__ = '1.2.3' +__version__ = '1.2.4' __maintainer__ = 'Vladimir Roncevic' __email__ = 'elektron.ronca@gmail.com' __status__ = 'Updated' diff --git a/pyproject.toml b/pyproject.toml index 9787c3b..07de284 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,3 @@ [build-system] requires = ["setuptools", "wheel"] -build-backend = "setuptools.build_meta" +build-backend = "setuptools.build_meta" \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index a60d79c..764f93e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -19,7 +19,7 @@ [metadata] name = gen_stm32 -version = 1.2.3 +version = 1.2.4 author = Vladimir Roncevic author_email = elektron.ronca@gmail.com description = STM32 Code Generator diff --git a/setup.py b/setup.py index 1078f1b..104da7a 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ ''' from __future__ import print_function -from typing import List +from typing import List, Optional from os.path import abspath, dirname, join from setuptools import setup @@ -29,7 +29,7 @@ __copyright__ = '(C) 2024, https://vroncevic.github.io/gen_stm32' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__ = 'https://github.com/vroncevic/gen_stm32/blob/dev/LICENSE' -__version__ = '1.2.3' +__version__ = '1.2.4' __maintainer__ = 'Vladimir Roncevic' __email__ = 'elektron.ronca@gmail.com' __status__ = 'Updated' @@ -47,7 +47,7 @@ SOURCE: str = 'conf/template/source/' LOG: str = 'log' THIS_DIR: str = abspath(dirname(__file__)) -long_description: str | None = None +long_description: Optional[str] = None with open(join(THIS_DIR, 'README.md'), encoding='utf-8') as readme: long_description = readme.read() PROGRAMMING_LANG: str = 'Programming Language :: Python ::' @@ -69,7 +69,7 @@ PYP_CLASSIFIERS: List[str] = SUPPORTED_PY_VERSIONS + APPROVED_LICENSES setup( name='gen_stm32', - version='1.2.3', + version='1.2.4', description='STM32 project skeleton generator', author='Vladimir Roncevic', author_email='elektron.ronca@gmail.com', diff --git a/tests/.coverage b/tests/.coverage index 7e5ca2777b030878e0633dee041322c3e29c7836..3c047ad48d521d0b452ab653a8d699308f92cfbf 100644 GIT binary patch delta 17 YcmZozz}&EadBfj+CI*Jh|N9vo073N!2LJ#7 delta 17 ZcmZozz}&EadBfj+rURv$|MxRG002qz2s{7) diff --git a/tests/gen_stm32_coverage.json b/tests/gen_stm32_coverage.json new file mode 100644 index 0000000..167b91a --- /dev/null +++ b/tests/gen_stm32_coverage.json @@ -0,0 +1 @@ +{"meta": {"format": 2, "version": "7.5.3", "timestamp": "2024-07-09T21:01:42.066248", "branch_coverage": false, "show_contexts": false}, "files": {"/data/dev/python/3_tools/gen_stm32/github/gen_stm32/gen_stm32/__init__.py": {"executed_lines": [3, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 43, 44, 45, 46, 47, 48, 49, 50, 53, 54, 72, 73, 74, 75, 76, 78, 86, 87, 94, 95, 96, 97, 98, 101, 102, 106, 112, 122, 123, 124, 125, 126, 127, 130, 131, 132, 136, 137, 140, 141, 148, 155, 156, 157, 176], "summary": {"covered_lines": 59, "num_statements": 71, "percent_covered": 83.09859154929578, "percent_covered_display": "83", "missing_lines": 12, "excluded_lines": 0}, "missing_lines": [39, 41, 152, 153, 154, 162, 163, 166, 167, 170, 172, 173], "excluded_lines": []}, "/data/dev/python/3_tools/gen_stm32/github/gen_stm32/gen_stm32/pro/__init__.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 41, 42, 43, 44, 45, 46, 47, 48, 51, 52, 70, 71, 73, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 96, 104, 106, 114, 116, 130, 131, 132, 135, 136, 137, 138, 139, 140, 141, 144, 145, 146], "summary": {"covered_lines": 57, "num_statements": 59, "percent_covered": 96.61016949152543, "percent_covered_display": "97", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [37, 39], "excluded_lines": []}, "/data/dev/python/3_tools/gen_stm32/github/gen_stm32/gen_stm32/pro/read_template.py": {"executed_lines": [3, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 48, 49, 63, 64, 66, 74, 75, 76, 77, 78, 79, 80, 82, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 115, 116, 117], "summary": {"covered_lines": 50, "num_statements": 52, "percent_covered": 96.15384615384616, "percent_covered_display": "96", "missing_lines": 2, "excluded_lines": 0}, "missing_lines": [34, 36], "excluded_lines": []}, "/data/dev/python/3_tools/gen_stm32/github/gen_stm32/gen_stm32/pro/write_template.py": {"executed_lines": [3, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 48, 49, 62, 64, 72, 73, 75, 94, 95, 96, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 145, 146, 149, 150, 151, 152, 153, 154, 156, 159, 160, 163], "summary": {"covered_lines": 75, "num_statements": 78, "percent_covered": 96.15384615384616, "percent_covered_display": "96", "missing_lines": 3, "excluded_lines": 0}, "missing_lines": [34, 36, 162], "excluded_lines": []}}, "totals": {"covered_lines": 241, "num_statements": 260, "percent_covered": 92.6923076923077, "percent_covered_display": "93", "missing_lines": 19, "excluded_lines": 0}} \ No newline at end of file diff --git a/tests/gen_stm32_coverage.xml b/tests/gen_stm32_coverage.xml new file mode 100644 index 0000000..ab15229 --- /dev/null +++ b/tests/gen_stm32_coverage.xml @@ -0,0 +1,298 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/gen_stm32_setup_test.py b/tests/gen_stm32_setup_test.py index 977685c..3f85a8c 100644 --- a/tests/gen_stm32_setup_test.py +++ b/tests/gen_stm32_setup_test.py @@ -38,7 +38,7 @@ __copyright__ = '(C) 2024, https://vroncevic.github.io/gen_stm8' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__ = 'https://github.com/vroncevic/gen_stm8/blob/dev/LICENSE' -__version__ = '1.2.3' +__version__ = '1.2.4' __maintainer__ = 'Vladimir Roncevic' __email__ = 'elektron.ronca@gmail.com' __status__ = 'Updated' diff --git a/tests/gen_stm32_test.py b/tests/gen_stm32_test.py index e444dec..b54e61a 100644 --- a/tests/gen_stm32_test.py +++ b/tests/gen_stm32_test.py @@ -37,7 +37,7 @@ __copyright__ = '(C) 2024, https://vroncevic.github.io/gen_stm8' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__ = 'https://github.com/vroncevic/gen_stm8/blob/dev/LICENSE' -__version__ = '1.2.3' +__version__ = '1.2.4' __maintainer__ = 'Vladimir Roncevic' __email__ = 'elektron.ronca@gmail.com' __status__ = 'Updated' @@ -60,7 +60,6 @@ class GenSTM32TestCase(TestCase): | test_missing_args - Test missing args. | test_wrong_arg - Test wrong arg. | test_process - Generate project structure. - | test_tool_not_operational - Test not operational. | test_pro_already_exists - Test pro already exists. ''' @@ -97,15 +96,6 @@ def test_process(self) -> None: generator: GenSTM32 = GenSTM32() self.assertTrue(generator.process()) - def test_tool_not_operational(self) -> None: - '''Test not operational''' - sys.argv.clear() - sys.argv.insert(0, '-n') - sys.argv.insert(1, 'fresh') - generator: GenSTM32 = GenSTM32() - generator.tool_operational = False - self.assertFalse(generator.process()) - def test_pro_already_exists(self) -> None: '''Test pro already exists''' sys.argv.clear() diff --git a/tests/read_template_test.py b/tests/read_template_test.py index ccfdf29..3ed9378 100644 --- a/tests/read_template_test.py +++ b/tests/read_template_test.py @@ -40,7 +40,7 @@ __copyright__ = '(C) 2024, https://vroncevic.github.io/gen_stm8' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__ = 'https://github.com/vroncevic/gen_stm8/blob/dev/LICENSE' -__version__ = '1.2.3' +__version__ = '1.2.4' __maintainer__ = 'Vladimir Roncevic' __email__ = 'elektron.ronca@gmail.com' __status__ = 'Updated' diff --git a/tests/run_coverage.sh b/tests/run_coverage.sh index 26d69bc..dc09fc1 100755 --- a/tests/run_coverage.sh +++ b/tests/run_coverage.sh @@ -7,6 +7,12 @@ # @author Vladimir Roncevic # +rm -rf htmlcov gen_stm32_coverage.xml gen_stm32_coverage.json .coverage +rm -rf new_simple_test/ full_simple/ latest/ +ats_coverage_run.py -n gen_stm32 -p ../README.md rm -rf new_simple_test/ full_simple/ latest/ python3 -m coverage run -m --source=../gen_stm32 unittest discover -s ./ -p '*_test.py' -vvv -python3 -m coverage html \ No newline at end of file +python3 -m coverage html -d htmlcov +python3 -m coverage xml -o gen_stm32_coverage.xml +python3 -m coverage json -o gen_stm32_coverage.json +python3 -m coverage report --format=markdown -m diff --git a/tests/write_template_test.py b/tests/write_template_test.py index f65296a..bb3e314 100644 --- a/tests/write_template_test.py +++ b/tests/write_template_test.py @@ -41,7 +41,7 @@ __copyright__ = '(C) 2024, https://vroncevic.github.io/gen_stm8' __credits__: List[str] = ['Vladimir Roncevic', 'Python Software Foundation'] __license__ = 'https://github.com/vroncevic/gen_stm8/blob/dev/LICENSE' -__version__ = '1.2.3' +__version__ = '1.2.4' __maintainer__ = 'Vladimir Roncevic' __email__ = 'elektron.ronca@gmail.com' __status__ = 'Updated'