modulitiz-micro 2.33.0__py311-none-any.whl → 2.34.0__py311-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. modulitiz_micro/ModuloBase64.py +61 -61
  2. modulitiz_micro/ModuloColorText.py +35 -35
  3. modulitiz_micro/ModuloDate.py +295 -295
  4. modulitiz_micro/ModuloFunzioni.py +70 -70
  5. modulitiz_micro/ModuloListe.py +150 -150
  6. modulitiz_micro/ModuloMeteo.py +72 -72
  7. modulitiz_micro/ModuloNumeri.py +130 -130
  8. modulitiz_micro/ModuloPyinstaller.py +29 -29
  9. modulitiz_micro/ModuloSeriale.py +61 -61
  10. modulitiz_micro/ModuloStatistiche.py +31 -31
  11. modulitiz_micro/ModuloStringhe.py +180 -180
  12. modulitiz_micro/ModuloTarghe.py +46 -46
  13. modulitiz_micro/android/ModuloAndroid.py +18 -18
  14. modulitiz_micro/android/ModuloAndroidAdb.py +48 -48
  15. modulitiz_micro/android/ModuloAndroidSim.py +130 -130
  16. modulitiz_micro/android/beans/SmsBean.py +12 -12
  17. modulitiz_micro/android/enums/AndroidSmsTypeEnum.py +17 -17
  18. modulitiz_micro/database/AbstractDatabaseService.py +13 -13
  19. modulitiz_micro/database/AbstractSql.py +69 -69
  20. modulitiz_micro/database/ModuloSqlOracle.py +19 -19
  21. modulitiz_micro/database/ModuloSqlServer.py +43 -43
  22. modulitiz_micro/database/eccezioni/EccezioneDbNoData.py +6 -6
  23. modulitiz_micro/database/mysql/AbstractBasicMysql.py +114 -114
  24. modulitiz_micro/database/mysql/ModuloMysql.py +163 -163
  25. modulitiz_micro/database/mysql/MysqlCommonConverter.py +47 -47
  26. modulitiz_micro/database/mysql/eccezioni/EccezioneMysqlOffline.py +6 -6
  27. modulitiz_micro/database/sqlite/AbstractBasicSQLite.py +114 -114
  28. modulitiz_micro/database/sqlite/ModuloSQLite.py +82 -82
  29. modulitiz_micro/eccezioni/EccezioneBase.py +7 -7
  30. modulitiz_micro/eccezioni/EccezioneCtrlC.py +7 -7
  31. modulitiz_micro/eccezioni/EccezioneRuntime.py +7 -7
  32. modulitiz_micro/eccezioni/EccezioneScheduler.py +7 -7
  33. modulitiz_micro/eccezioni/EccezioneSoNonSupportato.py +7 -7
  34. modulitiz_micro/eccezioni/http/EccezioneHttp.py +8 -8
  35. modulitiz_micro/eccezioni/http/EccezioneHttp404.py +7 -7
  36. modulitiz_micro/eccezioni/http/EccezioneHttpGeneric.py +7 -7
  37. modulitiz_micro/files/ModuloFiles.py +173 -173
  38. modulitiz_micro/files/ModuloLogging.py +69 -69
  39. modulitiz_micro/files/ModuloZip.py +42 -42
  40. modulitiz_micro/files/cache/CacheBean.py +5 -5
  41. modulitiz_micro/files/cache/CacheRam.py +29 -29
  42. modulitiz_micro/files/cache/DatabaseCache.py +91 -91
  43. modulitiz_micro/files/cache/decorators/cacheRam.py +26 -26
  44. modulitiz_micro/files/git/ModuloGit.py +28 -28
  45. modulitiz_micro/files/git/decorators/catchAndRaiseGitExceptions.py +19 -19
  46. modulitiz_micro/files/git/exceptions/EccezioneGit.py +7 -7
  47. modulitiz_micro/gestionedom/GestioneDom.py +44 -44
  48. modulitiz_micro/init/AbstractBasicInit.py +27 -27
  49. modulitiz_micro/init/AbstractInit.py +11 -11
  50. modulitiz_micro/keylogger/EccezioneKeyLogger.py +7 -7
  51. modulitiz_micro/keylogger/ModuloKeylogger.py +73 -73
  52. modulitiz_micro/multithread/ModuloThread.py +26 -26
  53. modulitiz_micro/multithread/ModuloThreadLogger.py +8 -8
  54. modulitiz_micro/multithread/ModuloThreadWithCallbackError.py +25 -25
  55. modulitiz_micro/nlp/ModuloNlp.py +36 -36
  56. modulitiz_micro/nlp/ModuloNlpDateAndTime.py +59 -59
  57. modulitiz_micro/rete/ModuloNetworking.py +67 -67
  58. modulitiz_micro/rete/ModuloOpenVpn.py +15 -15
  59. modulitiz_micro/rete/email/EmailBean.py +5 -5
  60. modulitiz_micro/rete/email/ModuloEmail.py +90 -90
  61. modulitiz_micro/rete/http/ModuloHttp.py +115 -115
  62. modulitiz_micro/rete/http/ModuloHttpConnectionSafe.py +91 -91
  63. modulitiz_micro/rete/http/ModuloHttpUtils.py +69 -69
  64. modulitiz_micro/rete/http/beans/HttpResponseBean.py +5 -5
  65. modulitiz_micro/rete/http/decorators/catchAndRaiseHttpExceptions.py +22 -22
  66. modulitiz_micro/rete/ntp/AbstractModuloNtp.py +73 -73
  67. modulitiz_micro/rete/ntp/ModuloNtpIt.py +8 -8
  68. modulitiz_micro/rete/socketserver/AbstractBasicGetSocketServer.py +35 -35
  69. modulitiz_micro/rete/socketserver/AbstractSocketServer.py +267 -267
  70. modulitiz_micro/rete/ssl/ModuloSsl.py +56 -56
  71. modulitiz_micro/sistema/EnvVarsEnum.py +9 -9
  72. modulitiz_micro/sistema/ModuloEnvVars.py +34 -34
  73. modulitiz_micro/sistema/ModuloSystem.py +298 -298
  74. modulitiz_micro/sistema/ModuloSystemPipe.py +67 -67
  75. modulitiz_micro/social/telegram/{ModuloTelegram.py → AbstractModuloTelegram.py} +53 -52
  76. modulitiz_micro/social/telegram/ModuloTelegramSimple.py +26 -26
  77. modulitiz_micro/util/beans/conf/AbstractBasicConfBean.py +11 -11
  78. modulitiz_micro/util/beans/conf/AbstractConfBean.py +16 -16
  79. modulitiz_micro/util/beans/fileconf/AbstractBasicFileConfBean.py +11 -11
  80. modulitiz_micro/util/beans/fileconf/AbstractFileConfBean.py +13 -13
  81. modulitiz_micro/util/beans/globalvar/AbstractBasicGlobalVarBean.py +15 -15
  82. modulitiz_micro/util/beans/globalvar/AbstractGlobalVarBean.py +34 -34
  83. modulitiz_micro/util/decorators/noAwait.py +23 -23
  84. modulitiz_micro/util/pip/AbstractModuloPip.py +41 -41
  85. modulitiz_micro/util/pip/ModuloPip.py +49 -49
  86. modulitiz_micro/util/scheduler/AbstractScheduler.py +32 -32
  87. modulitiz_micro/util/spooler/AbstractSpooler.py +14 -14
  88. modulitiz_micro/util/spooler/Spooler.py +18 -18
  89. modulitiz_micro/util/spooler/beans/QueueBean.py +8 -8
  90. modulitiz_micro/util/spooler/decorators/spooler.py +49 -49
  91. modulitiz_micro/util/spooler/eccezioni/EccezioneSpooler.py +7 -7
  92. modulitiz_micro/util/spooler/eccezioni/EccezioneSpoolerFull.py +7 -7
  93. modulitiz_micro/util/unittesting/AbstractOverrideTestUtil.py +31 -31
  94. modulitiz_micro/util/unittesting/AbstractTestUtil.py +11 -11
  95. modulitiz_micro/util/unittesting/ModuloRunUnitTest.py +25 -25
  96. modulitiz_micro/util/wheel/ModuloBuildWheel.py +117 -117
  97. modulitiz_micro/util/wheel/ModuloCheckTestNamingConvention.py +83 -83
  98. modulitiz_micro/util/wheel/ModuloToml.py +40 -40
  99. modulitiz_micro/util/wheel/ModuloWheel.py +12 -12
  100. {modulitiz_micro-2.33.0.dist-info → modulitiz_micro-2.34.0.dist-info}/LICENSE +21 -21
  101. {modulitiz_micro-2.33.0.dist-info → modulitiz_micro-2.34.0.dist-info}/METADATA +64 -64
  102. modulitiz_micro-2.34.0.dist-info/RECORD +104 -0
  103. modulitiz_micro-2.33.0.dist-info/RECORD +0 -104
  104. {modulitiz_micro-2.33.0.dist-info → modulitiz_micro-2.34.0.dist-info}/WHEEL +0 -0
  105. {modulitiz_micro-2.33.0.dist-info → modulitiz_micro-2.34.0.dist-info}/top_level.txt +0 -0
@@ -1,117 +1,117 @@
1
- import os
2
- import shutil
3
-
4
- from modulitiz_micro.ModuloColorText import ModuloColorText
5
- from modulitiz_micro.ModuloListe import ModuloListe
6
- from modulitiz_micro.files.ModuloFiles import ModuloFiles
7
- from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
8
- from modulitiz_micro.util.wheel.ModuloCheckTestNamingConvention import ModuloCheckTestNamingConvention
9
- from modulitiz_micro.util.wheel.ModuloToml import ModuloToml
10
-
11
-
12
- class ModuloBuildWheel(object):
13
- CMD_PYTHON="python"
14
- PATTERN_NOMEFILE_WHEEL="{}-{}-{}-none-any.whl"
15
-
16
- def __init__(self,moduleName:str,percorsoFileMain:str):
17
- self.moduleName=moduleName
18
-
19
- self.percorsoCartellaSource=os.path.dirname(percorsoFileMain)
20
- self.percorsoCartellaRoot=os.path.dirname(self.percorsoCartellaSource)
21
- self.skipUnitTest=False
22
-
23
- self.moduloToml=ModuloToml("pyproject.toml")
24
- self.moduloTestNamingConventions=ModuloCheckTestNamingConvention(moduleName,self.percorsoCartellaSource)
25
- self.versionOld=None
26
- self.versionNew=None
27
- self.filenameWheel=None
28
-
29
- def doWork(self):
30
- self.versionOld=self.moduloToml.retrieveVersion()
31
- self.skipUnitTest=input("Skip unit test? y, n (default = n):")=='y'
32
- # ask which version should be incremented (major, minor, bug fix)
33
- versionType=input("Which version increment? 1=major, 2=minor, 3=bug fix (default = 2):")
34
- if versionType=="":
35
- versionType=2
36
- else:
37
- versionType=int(versionType)
38
- # compute next version
39
- self.__computeVersionNew(versionType)
40
- # printing info
41
- msg=f"Build {self.moduleName} {self.versionNew}"
42
- ModuloSystem.setTitoloFinestra(msg)
43
- print("""{}
44
- ============================================================
45
- {} (from version {})
46
- ============================================================
47
- {}""".format(ModuloColorText.GRASSETTO,msg,self.versionOld,ModuloColorText.DEFAULT))
48
- # change dir
49
- os.chdir(self.percorsoCartellaSource)
50
- if self.__doUnitTests() is True:
51
- return
52
- # aggiorno versione
53
- self.moduloToml.updateVersion(self.versionNew)
54
- # building wheel
55
- ModuloSystem.systemCallPrintOutput(f'{self.CMD_PYTHON} -m pip install -U build twine==6.0.1',None)
56
- print()
57
- percorsoCartellaOut=ModuloFiles.pathJoin(self.percorsoCartellaRoot,"wheel")
58
- cmd='{} -m build --wheel --outdir "{}"'.format(self.CMD_PYTHON,percorsoCartellaOut)
59
- ModuloSystem.systemCallPrintOutput(cmd,None)
60
- # deleting temporary dirs
61
- print()
62
- shutil.rmtree(ModuloFiles.pathJoin(self.percorsoCartellaSource,"build"))
63
- shutil.rmtree(ModuloFiles.pathJoin(self.percorsoCartellaSource,self.moduleName+".egg-info"))
64
- # install wheel
65
- self.filenameWheel=self.PATTERN_NOMEFILE_WHEEL.format(self.moduleName,self.versionNew,self.moduloToml.retrieveMinPyVersion())
66
- percorsoWheel=ModuloFiles.pathJoin(percorsoCartellaOut,self.filenameWheel)
67
- cmd='{} -m pip install -U "{}"'.format(self.CMD_PYTHON,percorsoWheel)
68
- ModuloSystem.systemCallPrintOutput(cmd,None)
69
- print()
70
- print("Uploading to Pypi")
71
- cmd='{} -m twine upload "{}"'.format(self.CMD_PYTHON,percorsoWheel)
72
- ModuloSystem.systemCallPrintOutput(cmd,None)
73
- # delete wheel
74
- os.remove(percorsoWheel)
75
-
76
- def __doUnitTests(self) -> bool:
77
- if self.skipUnitTest is True:
78
- return False
79
- nomefileTest=ModuloFiles.pathJoin(self.percorsoCartellaSource,"test/TestMain.py")
80
- print("Check file and class naming conventions...")
81
- errors=self.moduloTestNamingConventions.doWork()
82
- if not ModuloListe.isEmpty(errors):
83
- errorsCount=len(errors)
84
- print("There %s %d error%s:"%("are" if errorsCount>1 else "is",errorsCount,"s" if errorsCount>1 else ""))
85
- for error in errors:
86
- print(error)
87
- return True
88
- print("Starting tests...")
89
- cmd='%s "%s"'%(self.CMD_PYTHON,nomefileTest)
90
- rows=[]
91
- for row in ModuloSystem.systemCallYieldOutput(cmd,None):
92
- print("%s>>>%s %s"%(ModuloColorText.BLU,ModuloColorText.DEFAULT,row))
93
- rows.append(row)
94
- rows=reversed(rows[-10:])
95
- rows=[x.strip() for x in rows]
96
- rows=[x if x!="" and x!=ModuloColorText.DEFAULT else None for x in rows]
97
- rows=ModuloListe.eliminaElementiVuoti(rows)
98
- lastRow=rows[0]
99
- PATTERN_TO_PRINT="""{}
100
- ==================================================
101
- {}
102
- ==================================================
103
- """+ModuloColorText.DEFAULT
104
- if lastRow!="OK":
105
- print(PATTERN_TO_PRINT.format(ModuloColorText.ROSSO,"Errors during tests execution"))
106
- return True
107
- print(PATTERN_TO_PRINT.format(ModuloColorText.VERDE,"Tests completed successfully"))
108
- return False
109
-
110
- def __computeVersionNew(self,versionType:int):
111
- arr=[int(x) for x in self.versionOld.split(".")]
112
- arr[versionType-1]+=1
113
- if versionType!=len(arr):
114
- for i in range(versionType,len(arr)):
115
- arr[i]=0
116
- arr=[str(x) for x in arr]
117
- self.versionNew=".".join(arr)
1
+ import os
2
+ import shutil
3
+
4
+ from modulitiz_micro.ModuloColorText import ModuloColorText
5
+ from modulitiz_micro.ModuloListe import ModuloListe
6
+ from modulitiz_micro.files.ModuloFiles import ModuloFiles
7
+ from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
8
+ from modulitiz_micro.util.wheel.ModuloCheckTestNamingConvention import ModuloCheckTestNamingConvention
9
+ from modulitiz_micro.util.wheel.ModuloToml import ModuloToml
10
+
11
+
12
+ class ModuloBuildWheel(object):
13
+ CMD_PYTHON="python"
14
+ PATTERN_NOMEFILE_WHEEL="{}-{}-{}-none-any.whl"
15
+
16
+ def __init__(self,moduleName:str,percorsoFileMain:str):
17
+ self.moduleName=moduleName
18
+
19
+ self.percorsoCartellaSource=os.path.dirname(percorsoFileMain)
20
+ self.percorsoCartellaRoot=os.path.dirname(self.percorsoCartellaSource)
21
+ self.skipUnitTest=False
22
+
23
+ self.moduloToml=ModuloToml("pyproject.toml")
24
+ self.moduloTestNamingConventions=ModuloCheckTestNamingConvention(moduleName,self.percorsoCartellaSource)
25
+ self.versionOld=None
26
+ self.versionNew=None
27
+ self.filenameWheel=None
28
+
29
+ def doWork(self):
30
+ self.versionOld=self.moduloToml.retrieveVersion()
31
+ self.skipUnitTest=input("Skip unit test? y, n (default = n):")=='y'
32
+ # ask which version should be incremented (major, minor, bug fix)
33
+ versionType=input("Which version increment? 1=major, 2=minor, 3=bug fix (default = 2):")
34
+ if versionType=="":
35
+ versionType=2
36
+ else:
37
+ versionType=int(versionType)
38
+ # compute next version
39
+ self.__computeVersionNew(versionType)
40
+ # printing info
41
+ msg=f"Build {self.moduleName} {self.versionNew}"
42
+ ModuloSystem.setTitoloFinestra(msg)
43
+ print("""{}
44
+ ============================================================
45
+ {} (from version {})
46
+ ============================================================
47
+ {}""".format(ModuloColorText.GRASSETTO,msg,self.versionOld,ModuloColorText.DEFAULT))
48
+ # change dir
49
+ os.chdir(self.percorsoCartellaSource)
50
+ if self.__doUnitTests() is True:
51
+ return
52
+ # aggiorno versione
53
+ self.moduloToml.updateVersion(self.versionNew)
54
+ # building wheel
55
+ ModuloSystem.systemCallPrintOutput(f'{self.CMD_PYTHON} -m pip install -U build twine==6.0.1',None)
56
+ print()
57
+ percorsoCartellaOut=ModuloFiles.pathJoin(self.percorsoCartellaRoot,"wheel")
58
+ cmd='{} -m build --wheel --outdir "{}"'.format(self.CMD_PYTHON,percorsoCartellaOut)
59
+ ModuloSystem.systemCallPrintOutput(cmd,None)
60
+ # deleting temporary dirs
61
+ print()
62
+ shutil.rmtree(ModuloFiles.pathJoin(self.percorsoCartellaSource,"build"))
63
+ shutil.rmtree(ModuloFiles.pathJoin(self.percorsoCartellaSource,self.moduleName+".egg-info"))
64
+ # install wheel
65
+ self.filenameWheel=self.PATTERN_NOMEFILE_WHEEL.format(self.moduleName,self.versionNew,self.moduloToml.retrieveMinPyVersion())
66
+ percorsoWheel=ModuloFiles.pathJoin(percorsoCartellaOut,self.filenameWheel)
67
+ cmd='{} -m pip install -U "{}"'.format(self.CMD_PYTHON,percorsoWheel)
68
+ ModuloSystem.systemCallPrintOutput(cmd,None)
69
+ print()
70
+ print("Uploading to Pypi")
71
+ cmd='{} -m twine upload "{}"'.format(self.CMD_PYTHON,percorsoWheel)
72
+ ModuloSystem.systemCallPrintOutput(cmd,None)
73
+ # delete wheel
74
+ os.remove(percorsoWheel)
75
+
76
+ def __doUnitTests(self) -> bool:
77
+ if self.skipUnitTest is True:
78
+ return False
79
+ nomefileTest=ModuloFiles.pathJoin(self.percorsoCartellaSource,"test/TestMain.py")
80
+ print("Check file and class naming conventions...")
81
+ errors=self.moduloTestNamingConventions.doWork()
82
+ if not ModuloListe.isEmpty(errors):
83
+ errorsCount=len(errors)
84
+ print("There %s %d error%s:"%("are" if errorsCount>1 else "is",errorsCount,"s" if errorsCount>1 else ""))
85
+ for error in errors:
86
+ print(error)
87
+ return True
88
+ print("Starting tests...")
89
+ cmd='%s "%s"'%(self.CMD_PYTHON,nomefileTest)
90
+ rows=[]
91
+ for row in ModuloSystem.systemCallYieldOutput(cmd,None):
92
+ print("%s>>>%s %s"%(ModuloColorText.BLU,ModuloColorText.DEFAULT,row))
93
+ rows.append(row)
94
+ rows=reversed(rows[-10:])
95
+ rows=[x.strip() for x in rows]
96
+ rows=[x if x!="" and x!=ModuloColorText.DEFAULT else None for x in rows]
97
+ rows=ModuloListe.eliminaElementiVuoti(rows)
98
+ lastRow=rows[0]
99
+ PATTERN_TO_PRINT="""{}
100
+ ==================================================
101
+ {}
102
+ ==================================================
103
+ """+ModuloColorText.DEFAULT
104
+ if lastRow!="OK":
105
+ print(PATTERN_TO_PRINT.format(ModuloColorText.ROSSO,"Errors during tests execution"))
106
+ return True
107
+ print(PATTERN_TO_PRINT.format(ModuloColorText.VERDE,"Tests completed successfully"))
108
+ return False
109
+
110
+ def __computeVersionNew(self,versionType:int):
111
+ arr=[int(x) for x in self.versionOld.split(".")]
112
+ arr[versionType-1]+=1
113
+ if versionType!=len(arr):
114
+ for i in range(versionType,len(arr)):
115
+ arr[i]=0
116
+ arr=[str(x) for x in arr]
117
+ self.versionNew=".".join(arr)
@@ -1,83 +1,83 @@
1
- import os.path
2
- import re
3
-
4
- from modulitiz_micro.ModuloFunzioni import ModuloFunzioni
5
- from modulitiz_micro.ModuloListe import ModuloListe
6
- from modulitiz_micro.ModuloStringhe import ModuloStringhe
7
- from modulitiz_micro.files.ModuloFiles import ModuloFiles
8
-
9
-
10
- class ModuloCheckTestNamingConvention(object):
11
- """
12
- Checks if naming convention of test classes matches real source classes.
13
- """
14
- EXCLUDE_DIRS=("testutil",)
15
- EXCLUDE_FILES=("TestMain.py",)
16
-
17
- def __init__(self,moduleName:str,pathSource:str):
18
- self.pathSource=ModuloFiles.pathJoin(pathSource,moduleName)
19
- self.pathTest=ModuloFiles.pathJoin(pathSource,"test")
20
- self.errors=[]
21
- self.__sourceFiles=[]
22
-
23
- def doWork(self)->list[str]:
24
- # check if paths exists
25
- self.__checkPath(self.pathSource)
26
- self.__checkPath(self.pathTest)
27
- # cache source files
28
- for rootRel,rootAbs,folders,filenames in ModuloFiles.walk(self.pathSource,(),self.EXCLUDE_DIRS,None,None):
29
- self.__sourceFiles.extend([ModuloFiles.pathJoin(rootRel,x) for x in filenames])
30
- self.__sourceFiles=[x for x in self.__sourceFiles if not ModuloStringhe.contains(x,"__pycache__")]
31
- # check every test file
32
- for rootRel,rootAbs,folders,filenames in ModuloFiles.walk(self.pathTest,self.EXCLUDE_FILES,self.EXCLUDE_DIRS,None,None):
33
- if not rootRel.endswith("__pycache__"):
34
- for filename in filenames:
35
- self.__checkFile(rootRel,rootAbs,filename)
36
- return self.errors
37
-
38
- def __checkPath(self,path:str):
39
- if os.path.exists(path):
40
- return
41
- self.errors.append("Path not exists: %s"%(path,))
42
-
43
- def __checkFile(self,rootRel:str,rootAbs:str,filename:str):
44
- filenameRel=ModuloFiles.pathJoin(rootRel,filename)
45
- filenameAbs=ModuloFiles.pathJoin(rootAbs,filename)
46
- isDecorator=ModuloStringhe.contains(rootRel,"decorators")
47
- # file name convention
48
- results=re.findall(r"[A-Z]\w+Test.py",filename)
49
- if ModuloListe.isEmpty(results):
50
- self.errors.append("File name not matching conventions: %s"%(filenameRel,))
51
- return
52
- # file name must match class name
53
- testClasses=ModuloFunzioni.getClassesFromFileSource(filenameAbs)
54
- if len(testClasses)>1:
55
- self.errors.append("File must not contain more than 1 class: %s"%(filenameRel,))
56
- return
57
- baseFilename=ModuloFiles.getBaseFileNameAndExtension(filename)[0]
58
- testClassName=None
59
- if not isDecorator:
60
- testClassName=testClasses[0]
61
- if testClassName!=baseFilename:
62
- self.errors.append("File and class names must be equals: %s"%(filenameRel,))
63
- return
64
- # test must follow source structure
65
- sourceFilenameRel=self.__getSourceFileNameFromTestFileName(rootRel,baseFilename,isDecorator)
66
- if sourceFilenameRel is None:
67
- self.errors.append("File doesn't match source dirs structure: %s"%(filenameRel,))
68
- return
69
- # source class name must equals class test
70
- if not isDecorator:
71
- sourceClassName=ModuloFunzioni.getClassesFromFileSource(ModuloFiles.pathJoin(self.pathSource,sourceFilenameRel))[0]
72
- if not testClassName.startswith(sourceClassName):
73
- self.errors.append("Test class name doesn't match source class name: %s"%(filenameRel,))
74
-
75
- def __getSourceFileNameFromTestFileName(self,rootRel:str,baseFilename:str,isDecorator:bool)-> str|None:
76
- partIncremental=""
77
- for part in re.findall(r'[A-Z](?:[a-z\d]+|[A-Z]*(?=[A-Z]|$))', baseFilename):
78
- partIncremental+=part
79
- partIncrementalToUse=partIncremental if not isDecorator else partIncremental[0].lower()+partIncremental[1:]
80
- filePathRel=ModuloFiles.pathJoin(rootRel,partIncrementalToUse)+".py"
81
- if filePathRel in self.__sourceFiles:
82
- return filePathRel
83
- return None
1
+ import os.path
2
+ import re
3
+
4
+ from modulitiz_micro.ModuloFunzioni import ModuloFunzioni
5
+ from modulitiz_micro.ModuloListe import ModuloListe
6
+ from modulitiz_micro.ModuloStringhe import ModuloStringhe
7
+ from modulitiz_micro.files.ModuloFiles import ModuloFiles
8
+
9
+
10
+ class ModuloCheckTestNamingConvention(object):
11
+ """
12
+ Checks if naming convention of test classes matches real source classes.
13
+ """
14
+ EXCLUDE_DIRS=("testutil",)
15
+ EXCLUDE_FILES=("TestMain.py",)
16
+
17
+ def __init__(self,moduleName:str,pathSource:str):
18
+ self.pathSource=ModuloFiles.pathJoin(pathSource,moduleName)
19
+ self.pathTest=ModuloFiles.pathJoin(pathSource,"test")
20
+ self.errors=[]
21
+ self.__sourceFiles=[]
22
+
23
+ def doWork(self)->list[str]:
24
+ # check if paths exists
25
+ self.__checkPath(self.pathSource)
26
+ self.__checkPath(self.pathTest)
27
+ # cache source files
28
+ for rootRel,rootAbs,folders,filenames in ModuloFiles.walk(self.pathSource,(),self.EXCLUDE_DIRS,None,None):
29
+ self.__sourceFiles.extend([ModuloFiles.pathJoin(rootRel,x) for x in filenames])
30
+ self.__sourceFiles=[x for x in self.__sourceFiles if not ModuloStringhe.contains(x,"__pycache__")]
31
+ # check every test file
32
+ for rootRel,rootAbs,folders,filenames in ModuloFiles.walk(self.pathTest,self.EXCLUDE_FILES,self.EXCLUDE_DIRS,None,None):
33
+ if not rootRel.endswith("__pycache__"):
34
+ for filename in filenames:
35
+ self.__checkFile(rootRel,rootAbs,filename)
36
+ return self.errors
37
+
38
+ def __checkPath(self,path:str):
39
+ if os.path.exists(path):
40
+ return
41
+ self.errors.append("Path not exists: %s"%(path,))
42
+
43
+ def __checkFile(self,rootRel:str,rootAbs:str,filename:str):
44
+ filenameRel=ModuloFiles.pathJoin(rootRel,filename)
45
+ filenameAbs=ModuloFiles.pathJoin(rootAbs,filename)
46
+ isDecorator=ModuloStringhe.contains(rootRel,"decorators")
47
+ # file name convention
48
+ results=re.findall(r"[A-Z]\w+Test.py",filename)
49
+ if ModuloListe.isEmpty(results):
50
+ self.errors.append("File name not matching conventions: %s"%(filenameRel,))
51
+ return
52
+ # file name must match class name
53
+ testClasses=ModuloFunzioni.getClassesFromFileSource(filenameAbs)
54
+ if len(testClasses)>1:
55
+ self.errors.append("File must not contain more than 1 class: %s"%(filenameRel,))
56
+ return
57
+ baseFilename=ModuloFiles.getBaseFileNameAndExtension(filename)[0]
58
+ testClassName=None
59
+ if not isDecorator:
60
+ testClassName=testClasses[0]
61
+ if testClassName!=baseFilename:
62
+ self.errors.append("File and class names must be equals: %s"%(filenameRel,))
63
+ return
64
+ # test must follow source structure
65
+ sourceFilenameRel=self.__getSourceFileNameFromTestFileName(rootRel,baseFilename,isDecorator)
66
+ if sourceFilenameRel is None:
67
+ self.errors.append("File doesn't match source dirs structure: %s"%(filenameRel,))
68
+ return
69
+ # source class name must equals class test
70
+ if not isDecorator:
71
+ sourceClassName=ModuloFunzioni.getClassesFromFileSource(ModuloFiles.pathJoin(self.pathSource,sourceFilenameRel))[0]
72
+ if not testClassName.startswith(sourceClassName):
73
+ self.errors.append("Test class name doesn't match source class name: %s"%(filenameRel,))
74
+
75
+ def __getSourceFileNameFromTestFileName(self,rootRel:str,baseFilename:str,isDecorator:bool)-> str|None:
76
+ partIncremental=""
77
+ for part in re.findall(r'[A-Z](?:[a-z\d]+|[A-Z]*(?=[A-Z]|$))', baseFilename):
78
+ partIncremental+=part
79
+ partIncrementalToUse=partIncremental if not isDecorator else partIncremental[0].lower()+partIncremental[1:]
80
+ filePathRel=ModuloFiles.pathJoin(rootRel,partIncrementalToUse)+".py"
81
+ if filePathRel in self.__sourceFiles:
82
+ return filePathRel
83
+ return None
@@ -1,40 +1,40 @@
1
- import re
2
-
3
- from modulitiz_micro.ModuloStringhe import ModuloStringhe
4
- from modulitiz_micro.files.ModuloFiles import ModuloFiles
5
- from modulitiz_micro.util.pip.ModuloPip import ModuloPip
6
-
7
-
8
- class ModuloToml(object):
9
- """
10
- Operazioni sul file .toml
11
- """
12
- REGEX_TOML_VERSION=r'version *= *"(%s)"'%(ModuloPip.REGEX_VERSION,)
13
-
14
- def __init__(self,nomefile:str):
15
- self.nomefile=nomefile
16
-
17
- def retrieveMinPyVersion(self)->str:
18
- output=self.__retrieveByRegex(r'python-tag* \= *"(py\d+)"')
19
- if output is None:
20
- return "py3"
21
- return output
22
-
23
- def retrieveVersion(self)->str|None:
24
- """
25
- Recupera la versione di una wheel leggendo il file .toml
26
- """
27
- return self.__retrieveByRegex(self.REGEX_TOML_VERSION)
28
-
29
- def updateVersion(self,version:str):
30
- cont=ModuloStringhe.normalizzaEol(ModuloFiles.readFileText(self.nomefile,True))
31
- cont=re.sub(self.REGEX_TOML_VERSION,r'version = "%s"'%(version,),cont)
32
- with ModuloFiles.open(self.nomefile,'wt') as fp:
33
- fp.write(cont)
34
-
35
- def __retrieveByRegex(self,regex:str)->str|None:
36
- cont=ModuloFiles.readFileText(self.nomefile,True)
37
- ricerca=re.search(regex,cont)
38
- if ricerca is None:
39
- return None
40
- return ricerca.group(1)
1
+ import re
2
+
3
+ from modulitiz_micro.ModuloStringhe import ModuloStringhe
4
+ from modulitiz_micro.files.ModuloFiles import ModuloFiles
5
+ from modulitiz_micro.util.pip.ModuloPip import ModuloPip
6
+
7
+
8
+ class ModuloToml(object):
9
+ """
10
+ Operazioni sul file .toml
11
+ """
12
+ REGEX_TOML_VERSION=r'version *= *"(%s)"'%(ModuloPip.REGEX_VERSION,)
13
+
14
+ def __init__(self,nomefile:str):
15
+ self.nomefile=nomefile
16
+
17
+ def retrieveMinPyVersion(self)->str:
18
+ output=self.__retrieveByRegex(r'python-tag* \= *"(py\d+)"')
19
+ if output is None:
20
+ return "py3"
21
+ return output
22
+
23
+ def retrieveVersion(self)->str|None:
24
+ """
25
+ Recupera la versione di una wheel leggendo il file .toml
26
+ """
27
+ return self.__retrieveByRegex(self.REGEX_TOML_VERSION)
28
+
29
+ def updateVersion(self,version:str):
30
+ cont=ModuloStringhe.normalizzaEol(ModuloFiles.readFileText(self.nomefile,True))
31
+ cont=re.sub(self.REGEX_TOML_VERSION,r'version = "%s"'%(version,),cont)
32
+ with ModuloFiles.open(self.nomefile,'wt') as fp:
33
+ fp.write(cont)
34
+
35
+ def __retrieveByRegex(self,regex:str)->str|None:
36
+ cont=ModuloFiles.readFileText(self.nomefile,True)
37
+ ricerca=re.search(regex,cont)
38
+ if ricerca is None:
39
+ return None
40
+ return ricerca.group(1)
@@ -1,12 +1,12 @@
1
- import importlib.metadata
2
-
3
- class ModuloWheel(object):
4
-
5
- def __init__(self,modulo):
6
- self.__modulo=modulo
7
-
8
- def retrieveVersion(self)->str:
9
- """
10
- Recupera la versione di una wheel, indipendentemente in che modo sia costruita (.toml, setup.py, poetry, ...)
11
- """
12
- return importlib.metadata.version(self.__modulo.__name__)
1
+ import importlib.metadata
2
+
3
+ class ModuloWheel(object):
4
+
5
+ def __init__(self,modulo):
6
+ self.__modulo=modulo
7
+
8
+ def retrieveVersion(self)->str:
9
+ """
10
+ Recupera la versione di una wheel, indipendentemente in che modo sia costruita (.toml, setup.py, poetry, ...)
11
+ """
12
+ return importlib.metadata.version(self.__modulo.__name__)
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2023-2040 tiz
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2023-2040 tiz
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.