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.
@@ -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 AbstractMysql
4
+ from modulitiz_micro.database.mysql.ModuloMysql import ModuloMysql
5
5
 
6
6
 
7
- class AbstractBasicMysql(AbstractMysql):
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 risultati in self.executeScript(sqlStr):
17
- yield risultati
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 risultati in self.executeScript(sqlInsertBasicTables):
22
- yield risultati
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 AbstractMysql(AbstractSql):
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 risultati in self.executeScript(sqlStr):
64
- yield risultati
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,cartelle,filenames in os.walk(path):
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.getNomefileEdEstensione(nomefile)
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,cartelle,nomefiles in os.walk(percorso):
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 cartelle:
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 getNomefileEdEstensione(nomefile:str)->tuple:
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,cartelle,nomefiles=result
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(cartelle):
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
- cartelle[index]=""
172
- cartelle=ModuloListe.eliminaElementiVuoti(cartelle)
173
- yield percorsoRel,percorso,cartelle,nomefiles
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,cartelle,nomefiles in ModuloFiles.walk(dirIn,(),(),None,None):
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.multithreading.ModuloThreadLogger import ModuloThreadLogger
5
- from modulitiz_micro.multithreading.ModuloThreadWithCallbackError import ModuloThreadWithCallbackError
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.multithreading.ModuloThreadWithCallbackError import ModuloThreadWithCallbackError
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 # frequenza richiesta NTP, l'rpi sballa di 45 minuti ogni 24 ore
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.multithreading.ModuloThread import ModuloThread
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.multithreading.ModuloThread import ModuloThread
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,nomeModulo:str,percorsoFileMain:str):
18
- self.nomeModulo=nomeModulo
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.nomefileWheel=None
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
- # chiedo quale versione aumentare (major, minor, bug fix)
35
- tipoVersione=input("Which version increment? 1=major, 2=minor, 3=bug fix (default = 2):")
36
- if tipoVersione=="":
37
- tipoVersione=2
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
- tipoVersione=int(tipoVersione)
40
- # calcolo la prossima versione
41
- self.__computeVersionNew(tipoVersione)
42
- # stampo info
43
- msg=f"Build {self.nomeModulo} {self.versionNew}"
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
- # cambio cartella
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
- # costruisco wheel
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=os.path.dirname(self.percorsoCartellaRoot)
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.nomeModulo+".egg-info"))
67
- # installo wheel
68
- self.nomefileWheel=self.PATTERN_NOMEFILE_WHEEL.format(self.nomeModulo,self.versionNew,self.moduloToml.retrieveMinPyVersion())
69
- percorsoWheel=ModuloFiles.pathJoin(percorsoCartellaOut,self.nomefileWheel)
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("Inizio test...")
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
- righe=[]
95
- for riga in ModuloSystem.systemCallYieldOutput(cmd,None):
96
- print("%s>>>%s %s"%(ModuloColorText.BLU,ModuloColorText.DEFAULT,riga))
97
- righe.append(riga)
98
- righe=reversed(righe[-10:])
99
- righe=[x.strip() for x in righe]
100
- righe=[x if x!="" and x!=ModuloColorText.DEFAULT else None for x in righe]
101
- righe=ModuloListe.eliminaElementiVuoti(righe)
102
- ultimaRiga=righe[0]
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 ultimaRiga!="OK":
109
- print(PATTERN_TO_PRINT.format(ModuloColorText.ROSSO,"ERRORE nei test"))
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,"test completati con successo"))
107
+ print(PATTERN_TO_PRINT.format(ModuloColorText.VERDE,"Tests completed successfully"))
112
108
  return False
113
109
 
114
- def __computeVersionNew(self,tipoVersione:int):
110
+ def __computeVersionNew(self,versionType:int):
115
111
  arr=[int(x) for x in self.versionOld.split(".")]
116
- arr[tipoVersione-1]+=1
117
- if tipoVersione!=len(arr):
118
- for i in range(tipoVersione,len(arr)):
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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: modulitiz_micro
3
- Version: 2.31.0
3
+ Version: 2.33.0
4
4
  Summary: Raccolta dei miei moduli - versione micro
5
5
  Author-email: tiz <sderfo1234@altervista.org>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -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=xr0JGHBiBpi4gNG7QjvxDsAYzKrnf0wHc2HcrXP4L70,1564
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=X3wjpemOc9QsHZ77xqheesCCc31ocOf0ori9BOQpR74,3579
24
- modulitiz_micro/database/mysql/ModuloMysql.py,sha256=WflNHypWWa9bl-os8d7WwDCV91ktVktx3iP594RLRUA,5540
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=jyR6o-FQYhVUTJOJEqgH9n9FS3zpXaeUWENSz6CBq8M,5683
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=eBI54TPFyOm6PjPoNU6fnrdHxCHK8iYxeYK2RwonLGs,1359
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=3GdvP4YpH7NPu5r0rnU37yoY67hj7Y3D09npsNvmTIM,579
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/multithreading/ModuloThread.py,sha256=a1_yx3ge7GqR0FZH4Q1uXrl7i2j6T80bxhCkb1Ara3w,988
53
- modulitiz_micro/multithreading/ModuloThreadLogger.py,sha256=YMFsiT5G2AAgJfEYACZGIjl1vHehwNpJrZw8nNQuc9A,366
54
- modulitiz_micro/multithreading/ModuloThreadWithCallbackError.py,sha256=RQWfLDssdVmXoewrWaCdVSrySjbElh2iNBqlSslg0W8,724
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=acwbAPhHz-1nEyxA2PzxLQC-_DKWIir4jy4CJFLA3Tk,2840
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=ze1SzJYUzgud6yjreJ9NGF4Ul6UBL9f0bzGENXNKRrY,9231
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=MKVK2YeD9e130Rp4a8lZuUfBcRinh4E1mhpyXX42Bmc,1883
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=-NTUqEjmGl8OUFa1hSwmBbLOaoJZhmzStvOexIN6CDo,5039
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.31.0.dist-info/LICENSE,sha256=b-Ia9Hv3N_FviXoFAXG44lDGbk4tCC0fBdduccm8nl0,1086
100
- modulitiz_micro-2.31.0.dist-info/METADATA,sha256=YENRtxuTjS0v5NVXm33hsoBPDkWp0OtckjNqXi4y808,1651
101
- modulitiz_micro-2.31.0.dist-info/WHEEL,sha256=2aRSX09k7pmd4gPs96VOQ860h0v0t30ka6JGHtpC3BY,94
102
- modulitiz_micro-2.31.0.dist-info/top_level.txt,sha256=ESJE0qtNJp3tbKPrffbFVjH511NSjJHxscfpdLjTpA8,16
103
- modulitiz_micro-2.31.0.dist-info/RECORD,,
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,,