modulitiz-micro 2.31.0__py311-none-any.whl → 2.33.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.
- modulitiz_micro/ModuloFunzioni.py +12 -0
- modulitiz_micro/database/mysql/AbstractBasicMysql.py +6 -6
- modulitiz_micro/database/mysql/ModuloMysql.py +3 -3
- modulitiz_micro/files/ModuloFiles.py +10 -10
- modulitiz_micro/files/ModuloZip.py +1 -1
- modulitiz_micro/files/git/ModuloGit.py +8 -0
- modulitiz_micro/{multithreading → multithread}/ModuloThread.py +2 -2
- modulitiz_micro/{multithreading → multithread}/ModuloThreadLogger.py +1 -1
- modulitiz_micro/rete/ntp/AbstractModuloNtp.py +1 -1
- modulitiz_micro/rete/socketserver/AbstractSocketServer.py +1 -1
- modulitiz_micro/sistema/ModuloSystemPipe.py +1 -1
- modulitiz_micro/util/wheel/ModuloBuildWheel.py +49 -53
- modulitiz_micro/util/wheel/ModuloCheckTestNamingConvention.py +83 -0
- {modulitiz_micro-2.31.0.dist-info → modulitiz_micro-2.33.0.dist-info}/METADATA +1 -1
- {modulitiz_micro-2.31.0.dist-info → modulitiz_micro-2.33.0.dist-info}/RECORD +19 -18
- /modulitiz_micro/{multithreading → multithread}/ModuloThreadWithCallbackError.py +0 -0
- {modulitiz_micro-2.31.0.dist-info → modulitiz_micro-2.33.0.dist-info}/LICENSE +0 -0
- {modulitiz_micro-2.31.0.dist-info → modulitiz_micro-2.33.0.dist-info}/WHEEL +0 -0
- {modulitiz_micro-2.31.0.dist-info → modulitiz_micro-2.33.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,9 @@
|
|
1
|
+
import ast
|
1
2
|
import random
|
2
3
|
import sys
|
3
4
|
|
5
|
+
from modulitiz_micro.files.ModuloFiles import ModuloFiles
|
6
|
+
|
4
7
|
|
5
8
|
class ModuloFunzioni(object):
|
6
9
|
"""
|
@@ -31,6 +34,15 @@ class ModuloFunzioni(object):
|
|
31
34
|
"""
|
32
35
|
return funzione.__module__+"."+funzione.__qualname__
|
33
36
|
|
37
|
+
@staticmethod
|
38
|
+
def getClassesFromFileSource(filename:str)->list[str]:
|
39
|
+
"""
|
40
|
+
Reads content of file, then finds all classes in it.
|
41
|
+
"""
|
42
|
+
module=ast.parse(ModuloFiles.readFileText(filename,True))
|
43
|
+
classes=[node.name for node in ast.walk(module) if isinstance(node,ast.ClassDef)]
|
44
|
+
return classes
|
45
|
+
|
34
46
|
@staticmethod
|
35
47
|
def orderDict(diz:dict)->dict:
|
36
48
|
"""
|
@@ -1,10 +1,10 @@
|
|
1
1
|
from abc import abstractmethod
|
2
2
|
|
3
3
|
from modulitiz_micro.ModuloStringhe import ModuloStringhe
|
4
|
-
from modulitiz_micro.database.mysql.ModuloMysql import
|
4
|
+
from modulitiz_micro.database.mysql.ModuloMysql import ModuloMysql
|
5
5
|
|
6
6
|
|
7
|
-
class AbstractBasicMysql(
|
7
|
+
class AbstractBasicMysql(ModuloMysql):
|
8
8
|
|
9
9
|
def __init__(self,*args,**kwargs):
|
10
10
|
super().__init__(*args,**kwargs)
|
@@ -13,13 +13,13 @@ class AbstractBasicMysql(AbstractMysql):
|
|
13
13
|
if not self.isDbNew:
|
14
14
|
return
|
15
15
|
sqlStr=ModuloStringhe.normalizzaEol(self.schemaBasicTables())
|
16
|
-
for
|
17
|
-
yield
|
16
|
+
for results in self.executeScript(sqlStr):
|
17
|
+
yield results
|
18
18
|
sqlInsertBasicTables=self.insertBasicTables()
|
19
19
|
if not ModuloStringhe.isEmpty(sqlInsertBasicTables):
|
20
20
|
sqlInsertBasicTables=ModuloStringhe.normalizzaEol(sqlInsertBasicTables)
|
21
|
-
for
|
22
|
-
yield
|
21
|
+
for results in self.executeScript(sqlInsertBasicTables):
|
22
|
+
yield results
|
23
23
|
self.commit()
|
24
24
|
|
25
25
|
def schemaBasicTables(self):
|
@@ -13,7 +13,7 @@ from modulitiz_micro.files.ModuloLogging import ModuloLogging
|
|
13
13
|
from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
|
14
14
|
|
15
15
|
|
16
|
-
class
|
16
|
+
class ModuloMysql(AbstractSql):
|
17
17
|
"""
|
18
18
|
select
|
19
19
|
count
|
@@ -60,8 +60,8 @@ class AbstractMysql(AbstractSql):
|
|
60
60
|
#se il db non esisteva creo le tabelle
|
61
61
|
if self.isDbNew:
|
62
62
|
sqlStr=ModuloStringhe.normalizzaEol(self.schema())
|
63
|
-
for
|
64
|
-
yield
|
63
|
+
for results in self.executeScript(sqlStr):
|
64
|
+
yield results
|
65
65
|
|
66
66
|
@staticmethod
|
67
67
|
def getLastIdInserted(cursoreDb):
|
@@ -51,7 +51,7 @@ class ModuloFiles(object):
|
|
51
51
|
if not os.path.exists(path) or os.path.isfile(path):
|
52
52
|
return -1
|
53
53
|
count=0
|
54
|
-
for root,
|
54
|
+
for root,dirs,filenames in os.walk(path):
|
55
55
|
for filename in filenames:
|
56
56
|
count+=cls.getFileSize(os.path.join(root,filename))
|
57
57
|
return count
|
@@ -97,7 +97,7 @@ class ModuloFiles(object):
|
|
97
97
|
|
98
98
|
@classmethod
|
99
99
|
def rinominaConTimestamp(cls,nomefile:str):
|
100
|
-
nomefileSenzaEstensione,ext=cls.
|
100
|
+
nomefileSenzaEstensione,ext=cls.getBaseFileNameAndExtension(nomefile)
|
101
101
|
nomefileNew=nomefileSenzaEstensione+"_"+ModuloDate.dateToString(None, ModuloDate.FORMATO_DATA_ORA_NOMEFILE)+ext
|
102
102
|
os.rename(nomefile,nomefileNew)
|
103
103
|
|
@@ -117,10 +117,10 @@ class ModuloFiles(object):
|
|
117
117
|
"""
|
118
118
|
elimina tutto il contenuto di una cartella ma non la cartella
|
119
119
|
"""
|
120
|
-
for root,
|
120
|
+
for root,dirs,nomefiles in os.walk(percorso):
|
121
121
|
for nomefile in nomefiles:
|
122
122
|
os.unlink(cls.pathJoin(root, nomefile))
|
123
|
-
for cartella in
|
123
|
+
for cartella in dirs:
|
124
124
|
shutil.rmtree(cls.pathJoin(root, cartella))
|
125
125
|
|
126
126
|
@staticmethod
|
@@ -130,7 +130,7 @@ class ModuloFiles(object):
|
|
130
130
|
os.remove(fileDaElim)
|
131
131
|
|
132
132
|
@staticmethod
|
133
|
-
def
|
133
|
+
def getBaseFileNameAndExtension(nomefile:str)->tuple:
|
134
134
|
arr=nomefile.split(".")
|
135
135
|
nomefileSenzaEstensione=".".join(arr[0:-1])
|
136
136
|
ext="."+arr[-1]
|
@@ -148,7 +148,7 @@ class ModuloFiles(object):
|
|
148
148
|
@classmethod
|
149
149
|
def __walk(cls,root: str,excludeFiles: list|tuple,excludeDirs: list|tuple,minByteSize: int|None,maxByteSize: int|None,
|
150
150
|
result:tuple[str, list[str], list[str]]):
|
151
|
-
percorso,
|
151
|
+
percorso,dirs,nomefiles=result
|
152
152
|
percorsoRel=cls.pathAbsToRel(percorso,root)
|
153
153
|
# elaboro i file
|
154
154
|
for index,nomefile in enumerate(nomefiles):
|
@@ -164,10 +164,10 @@ class ModuloFiles(object):
|
|
164
164
|
nomefiles[index]=""
|
165
165
|
nomefiles=ModuloListe.eliminaElementiVuoti(nomefiles)
|
166
166
|
#elaboro le cartelle
|
167
|
-
for index,cartella in enumerate(
|
167
|
+
for index,cartella in enumerate(dirs):
|
168
168
|
cartellaRelPath=cls.normalizzaPercorsoRemoto(cls.pathJoin(percorsoRel,cartella))
|
169
169
|
#escludo le cartelle che sono nella blacklist
|
170
170
|
if cartellaRelPath in excludeDirs:
|
171
|
-
|
172
|
-
|
173
|
-
yield percorsoRel,percorso,
|
171
|
+
dirs[index]=""
|
172
|
+
dirs=ModuloListe.eliminaElementiVuoti(dirs)
|
173
|
+
yield percorsoRel,percorso,dirs,nomefiles
|
@@ -29,7 +29,7 @@ class ModuloZip(object):
|
|
29
29
|
@staticmethod
|
30
30
|
def __fromFolder(fh,dirIn: str,includeRootDir: bool):
|
31
31
|
pathOutRootRel=os.path.basename(dirIn) if includeRootDir else ""
|
32
|
-
for pathRel,pathAbs,
|
32
|
+
for pathRel,pathAbs,dirs,nomefiles in ModuloFiles.walk(dirIn,(),(),None,None):
|
33
33
|
# controllo se devo scrivere anche la cartella principale
|
34
34
|
if not ModuloStringhe.isEmpty(pathOutRootRel):
|
35
35
|
pathOutRel=ModuloFiles.pathJoin(pathOutRootRel,pathRel)
|
@@ -15,6 +15,14 @@ class ModuloGit(object):
|
|
15
15
|
def getRemoteRevision(self)->str:
|
16
16
|
return self.inner.remotes[0].fetch()[0].ref.object.hexsha
|
17
17
|
|
18
|
+
@catchAndRaiseGitExceptions
|
19
|
+
def addFile(self,filenamePath:str):
|
20
|
+
self.inner.index.add(filenamePath)
|
21
|
+
|
22
|
+
@catchAndRaiseGitExceptions
|
23
|
+
def removeFile(self,filenamePath:str):
|
24
|
+
self.inner.index.remove(filenamePath,working_tree=True)
|
25
|
+
|
18
26
|
@catchAndRaiseGitExceptions
|
19
27
|
def update(self)->str:
|
20
28
|
return self.inner.remotes[0].pull()[0].ref.object.hexsha
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import threading
|
2
2
|
|
3
3
|
from modulitiz_micro.files.ModuloLogging import ModuloLogging
|
4
|
-
from modulitiz_micro.
|
5
|
-
from modulitiz_micro.
|
4
|
+
from modulitiz_micro.multithread.ModuloThreadLogger import ModuloThreadLogger
|
5
|
+
from modulitiz_micro.multithread.ModuloThreadWithCallbackError import ModuloThreadWithCallbackError
|
6
6
|
|
7
7
|
|
8
8
|
class ModuloThread(object):
|
@@ -1,5 +1,5 @@
|
|
1
1
|
from modulitiz_micro.files.ModuloLogging import ModuloLogging
|
2
|
-
from modulitiz_micro.
|
2
|
+
from modulitiz_micro.multithread.ModuloThreadWithCallbackError import ModuloThreadWithCallbackError
|
3
3
|
|
4
4
|
|
5
5
|
class ModuloThreadLogger(ModuloThreadWithCallbackError):
|
@@ -10,7 +10,7 @@ from modulitiz_micro.rete.http.decorators.catchAndRaiseHttpExceptions import cat
|
|
10
10
|
|
11
11
|
|
12
12
|
class AbstractModuloNtp(ABC):
|
13
|
-
REFRESH_CACHE_EVERY_SECS=4*3600*1000 #
|
13
|
+
REFRESH_CACHE_EVERY_SECS=4*3600*1000 # NTP request frequency
|
14
14
|
OFFSET_MILLIS=1 # offset correzione errore
|
15
15
|
TIMEOUT=10
|
16
16
|
|
@@ -12,7 +12,7 @@ from modulitiz_micro.ModuloStringhe import ModuloStringhe
|
|
12
12
|
from modulitiz_micro.eccezioni.EccezioneRuntime import EccezioneRuntime
|
13
13
|
from modulitiz_micro.files.ModuloFiles import ModuloFiles
|
14
14
|
from modulitiz_micro.files.ModuloLogging import ModuloLogging
|
15
|
-
from modulitiz_micro.
|
15
|
+
from modulitiz_micro.multithread.ModuloThread import ModuloThread
|
16
16
|
from modulitiz_micro.rete.ModuloNetworking import ModuloNetworking
|
17
17
|
from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
|
18
18
|
from modulitiz_micro.rete.http.ModuloHttpUtils import ModuloHttpUtils
|
@@ -7,7 +7,7 @@ import time
|
|
7
7
|
import psutil
|
8
8
|
|
9
9
|
from modulitiz_micro.files.ModuloLogging import ModuloLogging
|
10
|
-
from modulitiz_micro.
|
10
|
+
from modulitiz_micro.multithread.ModuloThread import ModuloThread
|
11
11
|
from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
|
12
12
|
|
13
13
|
|
@@ -5,117 +5,113 @@ from modulitiz_micro.ModuloColorText import ModuloColorText
|
|
5
5
|
from modulitiz_micro.ModuloListe import ModuloListe
|
6
6
|
from modulitiz_micro.files.ModuloFiles import ModuloFiles
|
7
7
|
from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
|
8
|
+
from modulitiz_micro.util.wheel.ModuloCheckTestNamingConvention import ModuloCheckTestNamingConvention
|
8
9
|
from modulitiz_micro.util.wheel.ModuloToml import ModuloToml
|
9
|
-
from modulitiz_micro.files.git.ModuloGit import ModuloGit
|
10
10
|
|
11
11
|
|
12
12
|
class ModuloBuildWheel(object):
|
13
13
|
CMD_PYTHON="python"
|
14
14
|
PATTERN_NOMEFILE_WHEEL="{}-{}-{}-none-any.whl"
|
15
|
-
MAX_VERSION_TO_KEEP=10
|
16
15
|
|
17
|
-
def __init__(self,
|
18
|
-
self.
|
19
|
-
self.nomeModuloNormalizzato=nomeModulo.replace("_","-")
|
16
|
+
def __init__(self,moduleName:str,percorsoFileMain:str):
|
17
|
+
self.moduleName=moduleName
|
20
18
|
|
21
19
|
self.percorsoCartellaSource=os.path.dirname(percorsoFileMain)
|
22
20
|
self.percorsoCartellaRoot=os.path.dirname(self.percorsoCartellaSource)
|
23
|
-
self.git=ModuloGit(os.path.dirname(self.percorsoCartellaRoot))
|
24
21
|
self.skipUnitTest=False
|
25
22
|
|
26
23
|
self.moduloToml=ModuloToml("pyproject.toml")
|
24
|
+
self.moduloTestNamingConventions=ModuloCheckTestNamingConvention(moduleName,self.percorsoCartellaSource)
|
27
25
|
self.versionOld=None
|
28
26
|
self.versionNew=None
|
29
|
-
self.
|
27
|
+
self.filenameWheel=None
|
30
28
|
|
31
29
|
def doWork(self):
|
32
30
|
self.versionOld=self.moduloToml.retrieveVersion()
|
33
31
|
self.skipUnitTest=input("Skip unit test? y, n (default = n):")=='y'
|
34
|
-
#
|
35
|
-
|
36
|
-
if
|
37
|
-
|
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
|
38
36
|
else:
|
39
|
-
|
40
|
-
#
|
41
|
-
self.__computeVersionNew(
|
42
|
-
#
|
43
|
-
msg=f"Build {self.
|
37
|
+
versionType=int(versionType)
|
38
|
+
# compute next version
|
39
|
+
self.__computeVersionNew(versionType)
|
40
|
+
# printing info
|
41
|
+
msg=f"Build {self.moduleName} {self.versionNew}"
|
44
42
|
ModuloSystem.setTitoloFinestra(msg)
|
45
43
|
print("""{}
|
46
44
|
============================================================
|
47
45
|
{} (from version {})
|
48
46
|
============================================================
|
49
47
|
{}""".format(ModuloColorText.GRASSETTO,msg,self.versionOld,ModuloColorText.DEFAULT))
|
50
|
-
#
|
48
|
+
# change dir
|
51
49
|
os.chdir(self.percorsoCartellaSource)
|
52
50
|
if self.__doUnitTests() is True:
|
53
51
|
return
|
54
52
|
# aggiorno versione
|
55
53
|
self.moduloToml.updateVersion(self.versionNew)
|
56
|
-
#
|
54
|
+
# building wheel
|
57
55
|
ModuloSystem.systemCallPrintOutput(f'{self.CMD_PYTHON} -m pip install -U build twine==6.0.1',None)
|
58
56
|
print()
|
59
|
-
percorsoCartellaOut=
|
60
|
-
percorsoCartellaOut=ModuloFiles.pathJoin(ModuloFiles.pathJoin(percorsoCartellaOut,"wheels"),self.nomeModuloNormalizzato)
|
57
|
+
percorsoCartellaOut=ModuloFiles.pathJoin(self.percorsoCartellaRoot,"wheel")
|
61
58
|
cmd='{} -m build --wheel --outdir "{}"'.format(self.CMD_PYTHON,percorsoCartellaOut)
|
62
59
|
ModuloSystem.systemCallPrintOutput(cmd,None)
|
60
|
+
# deleting temporary dirs
|
63
61
|
print()
|
64
|
-
# cancello cartelle temporanee
|
65
62
|
shutil.rmtree(ModuloFiles.pathJoin(self.percorsoCartellaSource,"build"))
|
66
|
-
shutil.rmtree(ModuloFiles.pathJoin(self.percorsoCartellaSource,self.
|
67
|
-
#
|
68
|
-
self.
|
69
|
-
percorsoWheel=ModuloFiles.pathJoin(percorsoCartellaOut,self.
|
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)
|
70
67
|
cmd='{} -m pip install -U "{}"'.format(self.CMD_PYTHON,percorsoWheel)
|
71
68
|
ModuloSystem.systemCallPrintOutput(cmd,None)
|
72
69
|
print()
|
73
|
-
# aggiungo il file al repo
|
74
|
-
self.git.inner.index.add(percorsoWheel)
|
75
|
-
# se presenti, cancello le versioni troppo vecchie
|
76
|
-
print()
|
77
|
-
oldFilenames=ModuloListe.humanOrder(os.listdir(percorsoCartellaOut))[:-self.MAX_VERSION_TO_KEEP]
|
78
|
-
if len(oldFilenames)==0:
|
79
|
-
return
|
80
|
-
print("Cancello le versioni troppo vecchie:")
|
81
|
-
for file in oldFilenames:
|
82
|
-
deletedFilename=self.git.inner.index.remove(ModuloFiles.pathJoin(percorsoCartellaOut,file),working_tree=True)
|
83
|
-
print("\n".join(deletedFilename))
|
84
70
|
print("Uploading to Pypi")
|
85
71
|
cmd='{} -m twine upload "{}"'.format(self.CMD_PYTHON,percorsoWheel)
|
86
72
|
ModuloSystem.systemCallPrintOutput(cmd,None)
|
73
|
+
# delete wheel
|
74
|
+
os.remove(percorsoWheel)
|
87
75
|
|
88
76
|
def __doUnitTests(self) -> bool:
|
89
77
|
if self.skipUnitTest is True:
|
90
78
|
return False
|
91
79
|
nomefileTest=ModuloFiles.pathJoin(self.percorsoCartellaSource,"test/TestMain.py")
|
92
|
-
print("
|
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...")
|
93
89
|
cmd='%s "%s"'%(self.CMD_PYTHON,nomefileTest)
|
94
|
-
|
95
|
-
for
|
96
|
-
print("%s>>>%s %s"%(ModuloColorText.BLU,ModuloColorText.DEFAULT,
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
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]
|
103
99
|
PATTERN_TO_PRINT="""{}
|
104
100
|
==================================================
|
105
101
|
{}
|
106
102
|
==================================================
|
107
103
|
"""+ModuloColorText.DEFAULT
|
108
|
-
if
|
109
|
-
print(PATTERN_TO_PRINT.format(ModuloColorText.ROSSO,"
|
104
|
+
if lastRow!="OK":
|
105
|
+
print(PATTERN_TO_PRINT.format(ModuloColorText.ROSSO,"Errors during tests execution"))
|
110
106
|
return True
|
111
|
-
print(PATTERN_TO_PRINT.format(ModuloColorText.VERDE,"
|
107
|
+
print(PATTERN_TO_PRINT.format(ModuloColorText.VERDE,"Tests completed successfully"))
|
112
108
|
return False
|
113
109
|
|
114
|
-
def __computeVersionNew(self,
|
110
|
+
def __computeVersionNew(self,versionType:int):
|
115
111
|
arr=[int(x) for x in self.versionOld.split(".")]
|
116
|
-
arr[
|
117
|
-
if
|
118
|
-
for i in range(
|
112
|
+
arr[versionType-1]+=1
|
113
|
+
if versionType!=len(arr):
|
114
|
+
for i in range(versionType,len(arr)):
|
119
115
|
arr[i]=0
|
120
116
|
arr=[str(x) for x in arr]
|
121
117
|
self.versionNew=".".join(arr)
|
@@ -0,0 +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,7 +1,7 @@
|
|
1
1
|
modulitiz_micro/ModuloBase64.py,sha256=dW1TP8TkIuOqAbbJcvTAo4xEurHl8NBs8lQTuHY_HaU,1866
|
2
2
|
modulitiz_micro/ModuloColorText.py,sha256=_sMSh9xZ-qbpa35oaSGdzQJKpFiGLsCHtM4P1HQWcTE,828
|
3
3
|
modulitiz_micro/ModuloDate.py,sha256=CNOoovOCkpn2eJeB8Jrit32qqUyJPw8fSYtMqhCw6K0,7990
|
4
|
-
modulitiz_micro/ModuloFunzioni.py,sha256=
|
4
|
+
modulitiz_micro/ModuloFunzioni.py,sha256=K-8rwVeSEgKCCLQSIXVHZ69YhLRCy3ILYxZXZOy95eI,1947
|
5
5
|
modulitiz_micro/ModuloListe.py,sha256=aWqnJX2JAk_LApUQvObkc6P89qXJzFviljJeKa39KC8,3581
|
6
6
|
modulitiz_micro/ModuloMeteo.py,sha256=Tr3lRW-lvk9XKm_M-ZvohJ6ueA9oA4TbP6BaZVeCl60,2310
|
7
7
|
modulitiz_micro/ModuloNumeri.py,sha256=aWTKRwVzFSXKZ7GGwJjl6xFZIE3xgAgq6cezVLw1qwM,2806
|
@@ -20,8 +20,8 @@ modulitiz_micro/database/AbstractSql.py,sha256=riJhqoOwQ_yEmcsmoLxAbbyyx0gZwAEjy
|
|
20
20
|
modulitiz_micro/database/ModuloSqlOracle.py,sha256=82pDbbT5sqe4rMcUzu9Nb2e7bROgs53yg1ufCg8GGkw,484
|
21
21
|
modulitiz_micro/database/ModuloSqlServer.py,sha256=jPIavBeX5VRue0yfqtvwvNiu40q8YgWIcqeo_PsJSQM,1235
|
22
22
|
modulitiz_micro/database/eccezioni/EccezioneDbNoData.py,sha256=eXcD3x3-3Wf6SFMEyQZj24KccHhVnSZteM9pkrsGU-g,186
|
23
|
-
modulitiz_micro/database/mysql/AbstractBasicMysql.py,sha256=
|
24
|
-
modulitiz_micro/database/mysql/ModuloMysql.py,sha256=
|
23
|
+
modulitiz_micro/database/mysql/AbstractBasicMysql.py,sha256=FMpdGO92N-QzFYICHmkW4defwbxbCuOax_V6Ek0r_hQ,3567
|
24
|
+
modulitiz_micro/database/mysql/ModuloMysql.py,sha256=muyrZzLV-7hQ_3SB3P0SMETTPoHEG-iPuJ4roBAynSQ,5534
|
25
25
|
modulitiz_micro/database/mysql/MysqlCommonConverter.py,sha256=jZFQykrgZ3L-hALfnCXnnN54OVfqb8xFtZs48WRt8nc,1336
|
26
26
|
modulitiz_micro/database/mysql/eccezioni/EccezioneMysqlOffline.py,sha256=gKNgFegRSYCNrNBlaq2helOyMhXjpVC_DKCt-i341Gs,164
|
27
27
|
modulitiz_micro/database/sqlite/AbstractBasicSQLite.py,sha256=fGTHx9fc86cvXo7xsatAP00C1IfKv6Kv9MoQa1nEUJw,3467
|
@@ -34,14 +34,14 @@ modulitiz_micro/eccezioni/EccezioneSoNonSupportato.py,sha256=kFq3n2j2emBVZaqquWH
|
|
34
34
|
modulitiz_micro/eccezioni/http/EccezioneHttp.py,sha256=9Vv254a1ejsx0Zh9D55YrwBChR-CGFOmCTimZSnKm28,228
|
35
35
|
modulitiz_micro/eccezioni/http/EccezioneHttp404.py,sha256=JQkrI8W7zW_NPzf92hFAYsTba1rrxeklizRh0u3y3QU,167
|
36
36
|
modulitiz_micro/eccezioni/http/EccezioneHttpGeneric.py,sha256=DsO7hNeyeMEJsgzW33z3tK9SU53pQoqFNRiwczU6pL0,171
|
37
|
-
modulitiz_micro/files/ModuloFiles.py,sha256=
|
37
|
+
modulitiz_micro/files/ModuloFiles.py,sha256=iNbsI4wu8SUy_Lm0_n8-f2jCjzsKIjCdAfSJCHjw6jQ,5655
|
38
38
|
modulitiz_micro/files/ModuloLogging.py,sha256=2MFqARcV7HvQDT4RwCuAh_Rju9lyXu6vaGFNU2hGLOk,2505
|
39
|
-
modulitiz_micro/files/ModuloZip.py,sha256=
|
39
|
+
modulitiz_micro/files/ModuloZip.py,sha256=0piZGfALUS26LmNoUt-0sQvNZj29TiEYxJB07LyI8S8,1355
|
40
40
|
modulitiz_micro/files/cache/CacheBean.py,sha256=EpOPXfg30oLLJ41wD-jTu9RhNCTRtGSlQcXPcBIj-Yg,133
|
41
41
|
modulitiz_micro/files/cache/CacheRam.py,sha256=iozy7AXCs-Tkn1HS_w7wovdzkCtRbyDbb2n9wVe3FPs,990
|
42
42
|
modulitiz_micro/files/cache/DatabaseCache.py,sha256=MD0eWEgQhOAmGTbm893rhcc9Nxf_vbr7z2bhqkyQJEk,2391
|
43
43
|
modulitiz_micro/files/cache/decorators/cacheRam.py,sha256=FQRzcNWTZKpU9cyrpWIumgg9GKGNBznTmSfok1QgvZM,770
|
44
|
-
modulitiz_micro/files/git/ModuloGit.py,sha256=
|
44
|
+
modulitiz_micro/files/git/ModuloGit.py,sha256=OGaQqR6SYQlS2tsPUTmhw0EnQYi3jMohTpGPVQy--hQ,821
|
45
45
|
modulitiz_micro/files/git/decorators/catchAndRaiseGitExceptions.py,sha256=qn876kuuLlG7C1hU36AvnG_CJWu2YCcPbXC6xZEjzt4,462
|
46
46
|
modulitiz_micro/files/git/exceptions/EccezioneGit.py,sha256=SfBBBvfo7XXJeUYpF61IzxuKAtRsqu1WvB_zsmJkG10,183
|
47
47
|
modulitiz_micro/gestionedom/GestioneDom.py,sha256=LjmFKiBLNc0yn9m7Z27u2rpU4UcF9778Ljm8aYhdBcY,1350
|
@@ -49,9 +49,9 @@ modulitiz_micro/init/AbstractBasicInit.py,sha256=hp2U5ZSIaWtwMuohlsk2WHjPRKxJrQy
|
|
49
49
|
modulitiz_micro/init/AbstractInit.py,sha256=0dxk2o6Sx3Ii4UzYvIMeWOClxdbmctO3M4XoMpk2v7k,228
|
50
50
|
modulitiz_micro/keylogger/EccezioneKeyLogger.py,sha256=BEhO2y8haOBfuboJHkZI_FyTmFsVw_uHKkQvjyBFkbk,212
|
51
51
|
modulitiz_micro/keylogger/ModuloKeylogger.py,sha256=7envuMiJVPGWDTzy9iq8tc9fPj1UKuaOfFz6viR8eDQ,1939
|
52
|
-
modulitiz_micro/
|
53
|
-
modulitiz_micro/
|
54
|
-
modulitiz_micro/
|
52
|
+
modulitiz_micro/multithread/ModuloThread.py,sha256=BB9t6tCGjDT4JuoEQ61AJmYiqY-oycjub3zq9gFVI_E,982
|
53
|
+
modulitiz_micro/multithread/ModuloThreadLogger.py,sha256=oQql4C3qrqOUksvcdrgZxgWOXArtEhW1G-nQwY_GNQY,363
|
54
|
+
modulitiz_micro/multithread/ModuloThreadWithCallbackError.py,sha256=RQWfLDssdVmXoewrWaCdVSrySjbElh2iNBqlSslg0W8,724
|
55
55
|
modulitiz_micro/nlp/ModuloNlp.py,sha256=h7ca9kVLKRcqHMK6rCVOambdpPfh-ehVSppP2nYGxVA,799
|
56
56
|
modulitiz_micro/nlp/ModuloNlpDateAndTime.py,sha256=QCURYksP4-z_u03CVzcESLp5EtdIx2GNXDNYgYOPGuU,1851
|
57
57
|
modulitiz_micro/rete/ModuloNetworking.py,sha256=ouaArJo-sc_eKrTaJW3rzk6zLtNtpfI8YGHQboi_urE,1999
|
@@ -63,15 +63,15 @@ modulitiz_micro/rete/http/ModuloHttpConnectionSafe.py,sha256=w1cLQrnPJXltUeJ4OOt
|
|
63
63
|
modulitiz_micro/rete/http/ModuloHttpUtils.py,sha256=9r6Z4eT4j4ZH-UyjOQXz_vUaltW-oH9gyyQLZDgVf7s,2350
|
64
64
|
modulitiz_micro/rete/http/beans/HttpResponseBean.py,sha256=7JVywcWURv1I9rYKj4Kt9XLt7387wMZGTMefcsm7E3I,202
|
65
65
|
modulitiz_micro/rete/http/decorators/catchAndRaiseHttpExceptions.py,sha256=MRhCeNMcy3hw-A8W40gozUY0FiL0tyKASauA7hRW0fo,595
|
66
|
-
modulitiz_micro/rete/ntp/AbstractModuloNtp.py,sha256=
|
66
|
+
modulitiz_micro/rete/ntp/AbstractModuloNtp.py,sha256=W6VDpPB41SlkAFYAXH9xx0YONk9Te6khx59DRBZL66M,2799
|
67
67
|
modulitiz_micro/rete/ntp/ModuloNtpIt.py,sha256=Un2tXPVcC5KJH3HkgvcpM7kgRQBprWTra_l91KJfcog,232
|
68
68
|
modulitiz_micro/rete/socketserver/AbstractBasicGetSocketServer.py,sha256=yZIdW0bzE28npXs5cLwlP5m6XeO5LJknMRIznBOOFEQ,1250
|
69
|
-
modulitiz_micro/rete/socketserver/AbstractSocketServer.py,sha256=
|
69
|
+
modulitiz_micro/rete/socketserver/AbstractSocketServer.py,sha256=ljEjUTEqPS2gzViTJcQm08Bm_A6P_SBR9YAPdhe1s4s,9228
|
70
70
|
modulitiz_micro/rete/ssl/ModuloSsl.py,sha256=marWKoe50_YzoveJRhuabCtivC9cLbt207qoztUV5Ss,2001
|
71
71
|
modulitiz_micro/sistema/EnvVarsEnum.py,sha256=dSSkKDJB9rjOS19KC8jdTB-j4KnouJ7WNZzko0AY2XU,161
|
72
72
|
modulitiz_micro/sistema/ModuloEnvVars.py,sha256=KynkdgQVGdMeYhdTmuIIQlGTd5_m8Mzv5nY57O9wk0U,854
|
73
73
|
modulitiz_micro/sistema/ModuloSystem.py,sha256=E-KtS-yrNWmDlIrLndoyuD78oy0dE_h99EnindyLhBs,8524
|
74
|
-
modulitiz_micro/sistema/ModuloSystemPipe.py,sha256=
|
74
|
+
modulitiz_micro/sistema/ModuloSystemPipe.py,sha256=77drlO8HsOy0xZD0kvJRUQNaJFJ-mzUQ_b4kAXQKsIc,1880
|
75
75
|
modulitiz_micro/social/telegram/ModuloTelegram.py,sha256=mLOM7niIjikTjl6WV0n7AVTYXzI811GnBTAPnP0nSxw,1712
|
76
76
|
modulitiz_micro/social/telegram/ModuloTelegramSimple.py,sha256=GBApwDtNlmKVxyAIRYBCtcD23WJGEsKMrX-YgRRhIaY,914
|
77
77
|
modulitiz_micro/util/beans/conf/AbstractBasicConfBean.py,sha256=X-4quS-xOo-oj9GNZXK1vF_KuM0Ru89e9rGVoxreNDE,405
|
@@ -93,11 +93,12 @@ modulitiz_micro/util/spooler/eccezioni/EccezioneSpoolerFull.py,sha256=KEcDisixOS
|
|
93
93
|
modulitiz_micro/util/unittesting/AbstractOverrideTestUtil.py,sha256=5YX20I-rhl6TpRrqSdNafI1cqBAdTs2sgtOTDjzDn5k,754
|
94
94
|
modulitiz_micro/util/unittesting/AbstractTestUtil.py,sha256=AW9mCj8i_qHrigcXcvvjgdLxa-4Ce0jrwJEZqpPVBxY,297
|
95
95
|
modulitiz_micro/util/unittesting/ModuloRunUnitTest.py,sha256=_YHxjTk_t9wvlCYgS4HSQ657ht7ekSRQsH7i1aKw1LY,774
|
96
|
-
modulitiz_micro/util/wheel/ModuloBuildWheel.py,sha256
|
96
|
+
modulitiz_micro/util/wheel/ModuloBuildWheel.py,sha256=S6Wrlwre9SC7UbBohwQ4vH_3ovhsUlKMlIpclzb-_Mc,4789
|
97
|
+
modulitiz_micro/util/wheel/ModuloCheckTestNamingConvention.py,sha256=2J3yE6Ba2EyhXSzH5gcmxHnEUOSGOin9dW_Q6dADsXM,3606
|
97
98
|
modulitiz_micro/util/wheel/ModuloToml.py,sha256=774GQ8y6lyhOrT0edJPlLq4TBU7Nq4699q74deGlFW4,1205
|
98
99
|
modulitiz_micro/util/wheel/ModuloWheel.py,sha256=VRS_6kSt62qubBYzkGm91_GWzcIiD0KlSnaqhM_aQnE,338
|
99
|
-
modulitiz_micro-2.
|
100
|
-
modulitiz_micro-2.
|
101
|
-
modulitiz_micro-2.
|
102
|
-
modulitiz_micro-2.
|
103
|
-
modulitiz_micro-2.
|
100
|
+
modulitiz_micro-2.33.0.dist-info/LICENSE,sha256=b-Ia9Hv3N_FviXoFAXG44lDGbk4tCC0fBdduccm8nl0,1086
|
101
|
+
modulitiz_micro-2.33.0.dist-info/METADATA,sha256=6jydfNWX5nWf524MWZvWWYQ9-Hhzz-FR7anpprIsJ0I,1651
|
102
|
+
modulitiz_micro-2.33.0.dist-info/WHEEL,sha256=2aRSX09k7pmd4gPs96VOQ860h0v0t30ka6JGHtpC3BY,94
|
103
|
+
modulitiz_micro-2.33.0.dist-info/top_level.txt,sha256=ESJE0qtNJp3tbKPrffbFVjH511NSjJHxscfpdLjTpA8,16
|
104
|
+
modulitiz_micro-2.33.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|