modulitiz-micro 2.34.0__py311-none-any.whl → 2.35.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/ModuloBase64.py +61 -61
- modulitiz_micro/ModuloColorText.py +35 -35
- modulitiz_micro/ModuloDate.py +295 -295
- modulitiz_micro/ModuloFunzioni.py +70 -70
- modulitiz_micro/ModuloListe.py +150 -150
- modulitiz_micro/ModuloMeteo.py +72 -72
- modulitiz_micro/ModuloNumeri.py +130 -130
- modulitiz_micro/ModuloPyinstaller.py +29 -29
- modulitiz_micro/ModuloSeriale.py +70 -61
- modulitiz_micro/ModuloStatistiche.py +31 -31
- modulitiz_micro/ModuloStringhe.py +180 -180
- modulitiz_micro/ModuloTarghe.py +46 -46
- modulitiz_micro/android/ModuloAndroid.py +18 -18
- modulitiz_micro/android/ModuloAndroidAdb.py +48 -48
- modulitiz_micro/android/ModuloAndroidSim.py +130 -130
- modulitiz_micro/android/beans/SmsBean.py +12 -12
- modulitiz_micro/android/enums/AndroidSmsTypeEnum.py +17 -17
- modulitiz_micro/database/AbstractDatabaseService.py +13 -13
- modulitiz_micro/database/AbstractSql.py +69 -69
- modulitiz_micro/database/ModuloSqlOracle.py +19 -19
- modulitiz_micro/database/ModuloSqlServer.py +43 -43
- modulitiz_micro/database/eccezioni/EccezioneDbNoData.py +6 -6
- modulitiz_micro/database/mysql/AbstractBasicMysql.py +114 -114
- modulitiz_micro/database/mysql/ModuloMysql.py +163 -163
- modulitiz_micro/database/mysql/MysqlCommonConverter.py +47 -47
- modulitiz_micro/database/mysql/eccezioni/EccezioneMysqlOffline.py +6 -6
- modulitiz_micro/database/sqlite/AbstractBasicSQLite.py +114 -114
- modulitiz_micro/database/sqlite/ModuloSQLite.py +82 -82
- modulitiz_micro/eccezioni/EccezioneBase.py +7 -7
- modulitiz_micro/eccezioni/EccezioneCtrlC.py +7 -7
- modulitiz_micro/eccezioni/EccezioneRuntime.py +7 -7
- modulitiz_micro/eccezioni/EccezioneScheduler.py +7 -7
- modulitiz_micro/eccezioni/EccezioneSoNonSupportato.py +7 -7
- modulitiz_micro/eccezioni/http/EccezioneHttp.py +8 -8
- modulitiz_micro/eccezioni/http/EccezioneHttp404.py +7 -7
- modulitiz_micro/eccezioni/http/EccezioneHttpGeneric.py +7 -7
- modulitiz_micro/files/ModuloFiles.py +173 -173
- modulitiz_micro/files/ModuloLogging.py +69 -69
- modulitiz_micro/files/ModuloZip.py +42 -42
- modulitiz_micro/files/cache/CacheBean.py +5 -5
- modulitiz_micro/files/cache/CacheRam.py +29 -29
- modulitiz_micro/files/cache/DatabaseCache.py +91 -91
- modulitiz_micro/files/cache/decorators/cacheRam.py +26 -26
- modulitiz_micro/files/git/ModuloGit.py +28 -28
- modulitiz_micro/files/git/decorators/catchAndRaiseGitExceptions.py +19 -19
- modulitiz_micro/files/git/exceptions/EccezioneGit.py +7 -7
- modulitiz_micro/gestionedom/GestioneDom.py +44 -44
- modulitiz_micro/init/AbstractBasicInit.py +27 -27
- modulitiz_micro/init/AbstractInit.py +11 -11
- modulitiz_micro/keylogger/EccezioneKeyLogger.py +7 -7
- modulitiz_micro/keylogger/ModuloKeylogger.py +73 -73
- modulitiz_micro/multithread/ModuloThread.py +26 -26
- modulitiz_micro/multithread/ModuloThreadLogger.py +8 -8
- modulitiz_micro/multithread/ModuloThreadWithCallbackError.py +25 -25
- modulitiz_micro/nlp/ModuloNlp.py +36 -36
- modulitiz_micro/nlp/ModuloNlpDateAndTime.py +59 -59
- modulitiz_micro/rete/ModuloNetworking.py +67 -67
- modulitiz_micro/rete/ModuloOpenVpn.py +15 -15
- modulitiz_micro/rete/email/EmailBean.py +5 -5
- modulitiz_micro/rete/email/ModuloEmail.py +90 -90
- modulitiz_micro/rete/http/ModuloHttp.py +115 -115
- modulitiz_micro/rete/http/ModuloHttpConnectionSafe.py +91 -91
- modulitiz_micro/rete/http/ModuloHttpUtils.py +69 -69
- modulitiz_micro/rete/http/beans/HttpResponseBean.py +5 -5
- modulitiz_micro/rete/http/decorators/catchAndRaiseHttpExceptions.py +22 -22
- modulitiz_micro/rete/ntp/AbstractModuloNtp.py +73 -73
- modulitiz_micro/rete/ntp/ModuloNtpIt.py +8 -8
- modulitiz_micro/rete/socketserver/AbstractBasicGetSocketServer.py +35 -35
- modulitiz_micro/rete/socketserver/AbstractSocketServer.py +267 -267
- modulitiz_micro/rete/ssl/ModuloSsl.py +56 -56
- modulitiz_micro/sistema/EnvVarsEnum.py +9 -9
- modulitiz_micro/sistema/ModuloEnvVars.py +34 -34
- modulitiz_micro/sistema/ModuloSystem.py +298 -298
- modulitiz_micro/sistema/ModuloSystemPipe.py +67 -67
- modulitiz_micro/social/telegram/AbstractModuloTelegram.py +53 -53
- modulitiz_micro/social/telegram/ModuloTelegramSimple.py +26 -26
- modulitiz_micro/util/beans/conf/AbstractBasicConfBean.py +11 -11
- modulitiz_micro/util/beans/conf/AbstractConfBean.py +16 -16
- modulitiz_micro/util/beans/fileconf/AbstractBasicFileConfBean.py +11 -11
- modulitiz_micro/util/beans/fileconf/AbstractFileConfBean.py +13 -13
- modulitiz_micro/util/beans/globalvar/AbstractBasicGlobalVarBean.py +15 -15
- modulitiz_micro/util/beans/globalvar/AbstractGlobalVarBean.py +34 -34
- modulitiz_micro/util/decorators/noAwait.py +23 -23
- modulitiz_micro/util/pip/AbstractModuloPip.py +41 -41
- modulitiz_micro/util/pip/ModuloPip.py +49 -49
- modulitiz_micro/util/scheduler/AbstractScheduler.py +32 -32
- modulitiz_micro/util/spooler/AbstractSpooler.py +14 -14
- modulitiz_micro/util/spooler/Spooler.py +18 -18
- modulitiz_micro/util/spooler/beans/QueueBean.py +8 -8
- modulitiz_micro/util/spooler/decorators/spooler.py +49 -49
- modulitiz_micro/util/spooler/eccezioni/EccezioneSpooler.py +7 -7
- modulitiz_micro/util/spooler/eccezioni/EccezioneSpoolerFull.py +7 -7
- modulitiz_micro/util/unittesting/AbstractOverrideTestUtil.py +31 -31
- modulitiz_micro/util/unittesting/AbstractTestUtil.py +11 -11
- modulitiz_micro/util/unittesting/ModuloRunUnitTest.py +25 -25
- modulitiz_micro/util/wheel/ModuloBuildWheel.py +117 -117
- modulitiz_micro/util/wheel/ModuloCheckTestNamingConvention.py +83 -83
- modulitiz_micro/util/wheel/ModuloToml.py +40 -40
- modulitiz_micro/util/wheel/ModuloWheel.py +12 -12
- {modulitiz_micro-2.34.0.dist-info → modulitiz_micro-2.35.0.dist-info}/LICENSE +21 -21
- {modulitiz_micro-2.34.0.dist-info → modulitiz_micro-2.35.0.dist-info}/METADATA +64 -64
- modulitiz_micro-2.35.0.dist-info/RECORD +104 -0
- modulitiz_micro-2.34.0.dist-info/RECORD +0 -104
- {modulitiz_micro-2.34.0.dist-info → modulitiz_micro-2.35.0.dist-info}/WHEEL +0 -0
- {modulitiz_micro-2.34.0.dist-info → modulitiz_micro-2.35.0.dist-info}/top_level.txt +0 -0
@@ -1,49 +1,49 @@
|
|
1
|
-
from modulitiz_micro.ModuloListe import ModuloListe
|
2
|
-
from modulitiz_micro.ModuloStringhe import ModuloStringhe
|
3
|
-
from modulitiz_micro.files.ModuloFiles import ModuloFiles
|
4
|
-
from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
|
5
|
-
from modulitiz_micro.util.pip.AbstractModuloPip import AbstractModuloPip
|
6
|
-
|
7
|
-
|
8
|
-
class ModuloPip(AbstractModuloPip):
|
9
|
-
|
10
|
-
@classmethod
|
11
|
-
def updateFromFileRequirements(cls,percorsoCartellaDipendenze: str) -> tuple[bool,str]:
|
12
|
-
fileDipendenze=ModuloFiles.pathJoin(percorsoCartellaDipendenze,"requirements.txt")
|
13
|
-
cmd='pip install -U -r "%s"'%(fileDipendenze,)
|
14
|
-
output=ModuloSystem.systemCallReturnOutput(cmd,None)
|
15
|
-
# check output
|
16
|
-
righe=ModuloListe.eliminaElementiVuoti(ModuloStringhe.normalizzaEol(output).split("\n"))
|
17
|
-
ultimeRigheReversed=righe[-10:]
|
18
|
-
ultimeRigheReversed.reverse()
|
19
|
-
isError=False
|
20
|
-
for riga in ultimeRigheReversed:
|
21
|
-
if riga.startswith(cls._PREFIX_OK):
|
22
|
-
elencoModuliAggiornati=riga.replace(cls._PREFIX_OK,"")
|
23
|
-
return True,elencoModuliAggiornati
|
24
|
-
if not isError and (riga.startswith("ERROR:") or riga.startswith("Exception:")):
|
25
|
-
isError=True
|
26
|
-
if isError:
|
27
|
-
msg="Aggiornamento moduli non riuscito:\n{}".format(output[-1000:])
|
28
|
-
return False,msg
|
29
|
-
return True," nessun aggiornamento"
|
30
|
-
|
31
|
-
@classmethod
|
32
|
-
def versionsFromFileRequirements(cls,percorsoCartellaDipendenze: str) -> list:
|
33
|
-
fileDipendenze=ModuloFiles.pathJoin(percorsoCartellaDipendenze,"requirements.txt")
|
34
|
-
if ModuloFiles.getFileSize(fileDipendenze)<=0:
|
35
|
-
return []
|
36
|
-
cont=ModuloStringhe.normalizzaEol(ModuloFiles.readFileText(fileDipendenze,None))
|
37
|
-
righe=ModuloListe.eliminaElementiVuoti(cont.split("\n"))
|
38
|
-
results=[]
|
39
|
-
# memorizzo opzioni
|
40
|
-
argsList=[]
|
41
|
-
for riga in righe:
|
42
|
-
if riga.startswith("-"):
|
43
|
-
argsList.append(riga)
|
44
|
-
args=" ".join(argsList)
|
45
|
-
# elaboro ogni modulo
|
46
|
-
for riga in righe:
|
47
|
-
if not riga.startswith("-"):
|
48
|
-
results.append(cls._versionFromFileRequirements(riga,args))
|
49
|
-
return results
|
1
|
+
from modulitiz_micro.ModuloListe import ModuloListe
|
2
|
+
from modulitiz_micro.ModuloStringhe import ModuloStringhe
|
3
|
+
from modulitiz_micro.files.ModuloFiles import ModuloFiles
|
4
|
+
from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
|
5
|
+
from modulitiz_micro.util.pip.AbstractModuloPip import AbstractModuloPip
|
6
|
+
|
7
|
+
|
8
|
+
class ModuloPip(AbstractModuloPip):
|
9
|
+
|
10
|
+
@classmethod
|
11
|
+
def updateFromFileRequirements(cls,percorsoCartellaDipendenze: str) -> tuple[bool,str]:
|
12
|
+
fileDipendenze=ModuloFiles.pathJoin(percorsoCartellaDipendenze,"requirements.txt")
|
13
|
+
cmd='pip install -U -r "%s"'%(fileDipendenze,)
|
14
|
+
output=ModuloSystem.systemCallReturnOutput(cmd,None)
|
15
|
+
# check output
|
16
|
+
righe=ModuloListe.eliminaElementiVuoti(ModuloStringhe.normalizzaEol(output).split("\n"))
|
17
|
+
ultimeRigheReversed=righe[-10:]
|
18
|
+
ultimeRigheReversed.reverse()
|
19
|
+
isError=False
|
20
|
+
for riga in ultimeRigheReversed:
|
21
|
+
if riga.startswith(cls._PREFIX_OK):
|
22
|
+
elencoModuliAggiornati=riga.replace(cls._PREFIX_OK,"")
|
23
|
+
return True,elencoModuliAggiornati
|
24
|
+
if not isError and (riga.startswith("ERROR:") or riga.startswith("Exception:")):
|
25
|
+
isError=True
|
26
|
+
if isError:
|
27
|
+
msg="Aggiornamento moduli non riuscito:\n{}".format(output[-1000:])
|
28
|
+
return False,msg
|
29
|
+
return True," nessun aggiornamento"
|
30
|
+
|
31
|
+
@classmethod
|
32
|
+
def versionsFromFileRequirements(cls,percorsoCartellaDipendenze: str) -> list:
|
33
|
+
fileDipendenze=ModuloFiles.pathJoin(percorsoCartellaDipendenze,"requirements.txt")
|
34
|
+
if ModuloFiles.getFileSize(fileDipendenze)<=0:
|
35
|
+
return []
|
36
|
+
cont=ModuloStringhe.normalizzaEol(ModuloFiles.readFileText(fileDipendenze,None))
|
37
|
+
righe=ModuloListe.eliminaElementiVuoti(cont.split("\n"))
|
38
|
+
results=[]
|
39
|
+
# memorizzo opzioni
|
40
|
+
argsList=[]
|
41
|
+
for riga in righe:
|
42
|
+
if riga.startswith("-"):
|
43
|
+
argsList.append(riga)
|
44
|
+
args=" ".join(argsList)
|
45
|
+
# elaboro ogni modulo
|
46
|
+
for riga in righe:
|
47
|
+
if not riga.startswith("-"):
|
48
|
+
results.append(cls._versionFromFileRequirements(riga,args))
|
49
|
+
return results
|
@@ -1,32 +1,32 @@
|
|
1
|
-
from abc import ABC
|
2
|
-
|
3
|
-
import schedule
|
4
|
-
|
5
|
-
from modulitiz_micro.ModuloListe import ModuloListe
|
6
|
-
|
7
|
-
|
8
|
-
class AbstractScheduler(ABC):
|
9
|
-
|
10
|
-
def __init__(self):
|
11
|
-
super().__init__()
|
12
|
-
|
13
|
-
@staticmethod
|
14
|
-
def cancelJobByTag(tag:str):
|
15
|
-
schedule.clear(tag)
|
16
|
-
|
17
|
-
@classmethod
|
18
|
-
def rescheduleJob(cls,tag:str,timeStr:str)->schedule.Job|None:
|
19
|
-
# recupero il job
|
20
|
-
jobs=schedule.get_jobs(tag)
|
21
|
-
if ModuloListe.isEmpty(jobs):
|
22
|
-
return None
|
23
|
-
job=jobs[0]
|
24
|
-
# cambio l'orario
|
25
|
-
job.at(timeStr)
|
26
|
-
# cancello quello vecchio
|
27
|
-
cls.cancelJobByTag(tag)
|
28
|
-
# lo aggiungo alla lista
|
29
|
-
job.scheduler.jobs.append(job)
|
30
|
-
# lo rischedulo
|
31
|
-
job._schedule_next_run()
|
32
|
-
return job
|
1
|
+
from abc import ABC
|
2
|
+
|
3
|
+
import schedule
|
4
|
+
|
5
|
+
from modulitiz_micro.ModuloListe import ModuloListe
|
6
|
+
|
7
|
+
|
8
|
+
class AbstractScheduler(ABC):
|
9
|
+
|
10
|
+
def __init__(self):
|
11
|
+
super().__init__()
|
12
|
+
|
13
|
+
@staticmethod
|
14
|
+
def cancelJobByTag(tag:str):
|
15
|
+
schedule.clear(tag)
|
16
|
+
|
17
|
+
@classmethod
|
18
|
+
def rescheduleJob(cls,tag:str,timeStr:str)->schedule.Job|None:
|
19
|
+
# recupero il job
|
20
|
+
jobs=schedule.get_jobs(tag)
|
21
|
+
if ModuloListe.isEmpty(jobs):
|
22
|
+
return None
|
23
|
+
job=jobs[0]
|
24
|
+
# cambio l'orario
|
25
|
+
job.at(timeStr)
|
26
|
+
# cancello quello vecchio
|
27
|
+
cls.cancelJobByTag(tag)
|
28
|
+
# lo aggiungo alla lista
|
29
|
+
job.scheduler.jobs.append(job)
|
30
|
+
# lo rischedulo
|
31
|
+
job._schedule_next_run()
|
32
|
+
return job
|
@@ -1,14 +1,14 @@
|
|
1
|
-
from abc import ABC
|
2
|
-
|
3
|
-
from modulitiz_micro.util.spooler.beans.QueueBean import QueueBean
|
4
|
-
|
5
|
-
|
6
|
-
class AbstractSpooler(ABC):
|
7
|
-
beans:dict[str,QueueBean]={}
|
8
|
-
|
9
|
-
@classmethod
|
10
|
-
def _areJobsNotDone(cls)->bool:
|
11
|
-
for bean in cls.beans.values():
|
12
|
-
if bean.size>0:
|
13
|
-
return True
|
14
|
-
return False
|
1
|
+
from abc import ABC
|
2
|
+
|
3
|
+
from modulitiz_micro.util.spooler.beans.QueueBean import QueueBean
|
4
|
+
|
5
|
+
|
6
|
+
class AbstractSpooler(ABC):
|
7
|
+
beans:dict[str,QueueBean]={}
|
8
|
+
|
9
|
+
@classmethod
|
10
|
+
def _areJobsNotDone(cls)->bool:
|
11
|
+
for bean in cls.beans.values():
|
12
|
+
if bean.size>0:
|
13
|
+
return True
|
14
|
+
return False
|
@@ -1,18 +1,18 @@
|
|
1
|
-
import time
|
2
|
-
|
3
|
-
from modulitiz_micro.util.spooler.AbstractSpooler import AbstractSpooler
|
4
|
-
from modulitiz_micro.util.spooler.beans.QueueBean import QueueBean
|
5
|
-
|
6
|
-
|
7
|
-
class Spooler(AbstractSpooler):
|
8
|
-
@staticmethod
|
9
|
-
def increaseSize(bean:QueueBean):
|
10
|
-
bean.size+=1
|
11
|
-
@staticmethod
|
12
|
-
def decreaseSize(bean:QueueBean):
|
13
|
-
bean.size-=1
|
14
|
-
|
15
|
-
@classmethod
|
16
|
-
def waitUntilJobsDone(cls):
|
17
|
-
while cls._areJobsNotDone():
|
18
|
-
time.sleep(0.1)
|
1
|
+
import time
|
2
|
+
|
3
|
+
from modulitiz_micro.util.spooler.AbstractSpooler import AbstractSpooler
|
4
|
+
from modulitiz_micro.util.spooler.beans.QueueBean import QueueBean
|
5
|
+
|
6
|
+
|
7
|
+
class Spooler(AbstractSpooler):
|
8
|
+
@staticmethod
|
9
|
+
def increaseSize(bean:QueueBean):
|
10
|
+
bean.size+=1
|
11
|
+
@staticmethod
|
12
|
+
def decreaseSize(bean:QueueBean):
|
13
|
+
bean.size-=1
|
14
|
+
|
15
|
+
@classmethod
|
16
|
+
def waitUntilJobsDone(cls):
|
17
|
+
while cls._areJobsNotDone():
|
18
|
+
time.sleep(0.1)
|
@@ -1,8 +1,8 @@
|
|
1
|
-
import threading
|
2
|
-
|
3
|
-
|
4
|
-
class QueueBean(object):
|
5
|
-
def __init__(self):
|
6
|
-
self.lock=threading.Lock()
|
7
|
-
self.size=0
|
8
|
-
self.countConsecutiveOverSize=0
|
1
|
+
import threading
|
2
|
+
|
3
|
+
|
4
|
+
class QueueBean(object):
|
5
|
+
def __init__(self):
|
6
|
+
self.lock=threading.Lock()
|
7
|
+
self.size=0
|
8
|
+
self.countConsecutiveOverSize=0
|
@@ -1,49 +1,49 @@
|
|
1
|
-
from functools import wraps
|
2
|
-
|
3
|
-
from modulitiz_micro.ModuloFunzioni import ModuloFunzioni
|
4
|
-
from modulitiz_micro.util.spooler.Spooler import Spooler
|
5
|
-
from modulitiz_micro.util.spooler.beans.QueueBean import QueueBean
|
6
|
-
from modulitiz_micro.util.spooler.eccezioni.EccezioneSpooler import EccezioneSpooler
|
7
|
-
from modulitiz_micro.util.spooler.eccezioni.EccezioneSpoolerFull import EccezioneSpoolerFull
|
8
|
-
|
9
|
-
|
10
|
-
def spooler(maxSize:int,notifyIfConsecutiveSizeGreaterThan:int=0):
|
11
|
-
"""
|
12
|
-
Usare questo decorator per produrre (creare) la coda di azioni e consumarla (scodare) non appena c'è uno slot libero.
|
13
|
-
:param maxSize: dimensione massima della coda
|
14
|
-
:param notifyIfConsecutiveSizeGreaterThan: cosa fare se la coda è piena:
|
15
|
-
- 0: notifica sempre
|
16
|
-
- >0: notifica solo se maggiore di N
|
17
|
-
"""
|
18
|
-
# controllo parametri di input
|
19
|
-
if notifyIfConsecutiveSizeGreaterThan>maxSize:
|
20
|
-
raise EccezioneSpooler("%d non può essere maggiore di %d"%(notifyIfConsecutiveSizeGreaterThan,maxSize))
|
21
|
-
|
22
|
-
def decorator(funzione):
|
23
|
-
@wraps(funzione)
|
24
|
-
def wrapped(*args,**kwargs):
|
25
|
-
fullPathFunction=ModuloFunzioni.getFullyQualifiedName(funzione)
|
26
|
-
bean=Spooler.beans.get(fullPathFunction,None)
|
27
|
-
if bean is None:
|
28
|
-
bean=QueueBean()
|
29
|
-
Spooler.beans[fullPathFunction]=bean
|
30
|
-
# controllo se ho raggiunto o superato il limite
|
31
|
-
if bean.size>=maxSize:
|
32
|
-
bean.countConsecutiveOverSize+=1
|
33
|
-
if bean.countConsecutiveOverSize>notifyIfConsecutiveSizeGreaterThan:
|
34
|
-
bean.countConsecutiveOverSize=0
|
35
|
-
raise EccezioneSpoolerFull()
|
36
|
-
else:
|
37
|
-
bean.countConsecutiveOverSize=0
|
38
|
-
# chiamo la funzione
|
39
|
-
Spooler.increaseSize(bean)
|
40
|
-
try:
|
41
|
-
with bean.lock:
|
42
|
-
output=funzione(*args,**kwargs)
|
43
|
-
except Exception as e:
|
44
|
-
Spooler.decreaseSize(bean)
|
45
|
-
raise e
|
46
|
-
Spooler.decreaseSize(bean)
|
47
|
-
return output
|
48
|
-
return wrapped
|
49
|
-
return decorator
|
1
|
+
from functools import wraps
|
2
|
+
|
3
|
+
from modulitiz_micro.ModuloFunzioni import ModuloFunzioni
|
4
|
+
from modulitiz_micro.util.spooler.Spooler import Spooler
|
5
|
+
from modulitiz_micro.util.spooler.beans.QueueBean import QueueBean
|
6
|
+
from modulitiz_micro.util.spooler.eccezioni.EccezioneSpooler import EccezioneSpooler
|
7
|
+
from modulitiz_micro.util.spooler.eccezioni.EccezioneSpoolerFull import EccezioneSpoolerFull
|
8
|
+
|
9
|
+
|
10
|
+
def spooler(maxSize:int,notifyIfConsecutiveSizeGreaterThan:int=0):
|
11
|
+
"""
|
12
|
+
Usare questo decorator per produrre (creare) la coda di azioni e consumarla (scodare) non appena c'è uno slot libero.
|
13
|
+
:param maxSize: dimensione massima della coda
|
14
|
+
:param notifyIfConsecutiveSizeGreaterThan: cosa fare se la coda è piena:
|
15
|
+
- 0: notifica sempre
|
16
|
+
- >0: notifica solo se maggiore di N
|
17
|
+
"""
|
18
|
+
# controllo parametri di input
|
19
|
+
if notifyIfConsecutiveSizeGreaterThan>maxSize:
|
20
|
+
raise EccezioneSpooler("%d non può essere maggiore di %d"%(notifyIfConsecutiveSizeGreaterThan,maxSize))
|
21
|
+
|
22
|
+
def decorator(funzione):
|
23
|
+
@wraps(funzione)
|
24
|
+
def wrapped(*args,**kwargs):
|
25
|
+
fullPathFunction=ModuloFunzioni.getFullyQualifiedName(funzione)
|
26
|
+
bean=Spooler.beans.get(fullPathFunction,None)
|
27
|
+
if bean is None:
|
28
|
+
bean=QueueBean()
|
29
|
+
Spooler.beans[fullPathFunction]=bean
|
30
|
+
# controllo se ho raggiunto o superato il limite
|
31
|
+
if bean.size>=maxSize:
|
32
|
+
bean.countConsecutiveOverSize+=1
|
33
|
+
if bean.countConsecutiveOverSize>notifyIfConsecutiveSizeGreaterThan:
|
34
|
+
bean.countConsecutiveOverSize=0
|
35
|
+
raise EccezioneSpoolerFull()
|
36
|
+
else:
|
37
|
+
bean.countConsecutiveOverSize=0
|
38
|
+
# chiamo la funzione
|
39
|
+
Spooler.increaseSize(bean)
|
40
|
+
try:
|
41
|
+
with bean.lock:
|
42
|
+
output=funzione(*args,**kwargs)
|
43
|
+
except Exception as e:
|
44
|
+
Spooler.decreaseSize(bean)
|
45
|
+
raise e
|
46
|
+
Spooler.decreaseSize(bean)
|
47
|
+
return output
|
48
|
+
return wrapped
|
49
|
+
return decorator
|
@@ -1,7 +1,7 @@
|
|
1
|
-
from modulitiz_micro.eccezioni.EccezioneBase import EccezioneBase
|
2
|
-
|
3
|
-
|
4
|
-
class EccezioneSpooler(EccezioneBase):
|
5
|
-
|
6
|
-
def __init__(self,msg:str):
|
7
|
-
super().__init__(msg)
|
1
|
+
from modulitiz_micro.eccezioni.EccezioneBase import EccezioneBase
|
2
|
+
|
3
|
+
|
4
|
+
class EccezioneSpooler(EccezioneBase):
|
5
|
+
|
6
|
+
def __init__(self,msg:str):
|
7
|
+
super().__init__(msg)
|
@@ -1,7 +1,7 @@
|
|
1
|
-
from modulitiz_micro.util.spooler.eccezioni.EccezioneSpooler import EccezioneSpooler
|
2
|
-
|
3
|
-
|
4
|
-
class EccezioneSpoolerFull(EccezioneSpooler):
|
5
|
-
|
6
|
-
def __init__(self):
|
7
|
-
super().__init__("Spooler pieno")
|
1
|
+
from modulitiz_micro.util.spooler.eccezioni.EccezioneSpooler import EccezioneSpooler
|
2
|
+
|
3
|
+
|
4
|
+
class EccezioneSpoolerFull(EccezioneSpooler):
|
5
|
+
|
6
|
+
def __init__(self):
|
7
|
+
super().__init__("Spooler pieno")
|
@@ -1,31 +1,31 @@
|
|
1
|
-
from abc import ABC
|
2
|
-
|
3
|
-
from modulitiz_micro.eccezioni.EccezioneRuntime import EccezioneRuntime
|
4
|
-
|
5
|
-
|
6
|
-
class AbstractOverrideTestUtil(ABC):
|
7
|
-
"""
|
8
|
-
Solo le funzioni statiche devono essere revertate
|
9
|
-
"""
|
10
|
-
|
11
|
-
def __init__(self):
|
12
|
-
super().__init__()
|
13
|
-
self._cache={}
|
14
|
-
|
15
|
-
def __enter__(self):
|
16
|
-
self._cache.clear()
|
17
|
-
return self
|
18
|
-
|
19
|
-
def __exit__(self,*args,**kwargs):
|
20
|
-
self._cache.clear()
|
21
|
-
|
22
|
-
@staticmethod
|
23
|
-
def getMockedFunction(throwExc:Exception|None,expectedValue: str|tuple|None):
|
24
|
-
"""
|
25
|
-
Must use only 1 param.
|
26
|
-
"""
|
27
|
-
if throwExc is not None:
|
28
|
-
return lambda *args,**kwargs:(_ for _ in ()).throw(throwExc)
|
29
|
-
elif expectedValue is not None:
|
30
|
-
return lambda *args,**kwargs:expectedValue
|
31
|
-
raise EccezioneRuntime("Use only 1 param")
|
1
|
+
from abc import ABC
|
2
|
+
|
3
|
+
from modulitiz_micro.eccezioni.EccezioneRuntime import EccezioneRuntime
|
4
|
+
|
5
|
+
|
6
|
+
class AbstractOverrideTestUtil(ABC):
|
7
|
+
"""
|
8
|
+
Solo le funzioni statiche devono essere revertate
|
9
|
+
"""
|
10
|
+
|
11
|
+
def __init__(self):
|
12
|
+
super().__init__()
|
13
|
+
self._cache={}
|
14
|
+
|
15
|
+
def __enter__(self):
|
16
|
+
self._cache.clear()
|
17
|
+
return self
|
18
|
+
|
19
|
+
def __exit__(self,*args,**kwargs):
|
20
|
+
self._cache.clear()
|
21
|
+
|
22
|
+
@staticmethod
|
23
|
+
def getMockedFunction(throwExc:Exception|None,expectedValue: str|tuple|None):
|
24
|
+
"""
|
25
|
+
Must use only 1 param.
|
26
|
+
"""
|
27
|
+
if throwExc is not None:
|
28
|
+
return lambda *args,**kwargs:(_ for _ in ()).throw(throwExc)
|
29
|
+
elif expectedValue is not None:
|
30
|
+
return lambda *args,**kwargs:expectedValue
|
31
|
+
raise EccezioneRuntime("Use only 1 param")
|
@@ -1,11 +1,11 @@
|
|
1
|
-
import unittest
|
2
|
-
|
3
|
-
|
4
|
-
class AbstractTestUtil(unittest.TestCase):
|
5
|
-
overrideTestUtil=None
|
6
|
-
|
7
|
-
def __init__(self,*args,**kwargs):
|
8
|
-
super().__init__(*args,**kwargs)
|
9
|
-
logger=type('test',(),{})()
|
10
|
-
logger.exception=logger.error=logger.warning=logger.info=logger.debug=print
|
11
|
-
self.logger=logger
|
1
|
+
import unittest
|
2
|
+
|
3
|
+
|
4
|
+
class AbstractTestUtil(unittest.TestCase):
|
5
|
+
overrideTestUtil=None
|
6
|
+
|
7
|
+
def __init__(self,*args,**kwargs):
|
8
|
+
super().__init__(*args,**kwargs)
|
9
|
+
logger=type('test',(),{})()
|
10
|
+
logger.exception=logger.error=logger.warning=logger.info=logger.debug=print
|
11
|
+
self.logger=logger
|
@@ -1,25 +1,25 @@
|
|
1
|
-
import os
|
2
|
-
import pkgutil
|
3
|
-
import unittest
|
4
|
-
|
5
|
-
|
6
|
-
class ModuloRunUnitTest(object):
|
7
|
-
|
8
|
-
@classmethod
|
9
|
-
def startTests(cls,currentFilePath:str):
|
10
|
-
suite=cls.__createTestSuite(currentFilePath)
|
11
|
-
unittest.TextTestRunner(verbosity=2).run(suite)
|
12
|
-
|
13
|
-
@staticmethod
|
14
|
-
def __createTestSuite(currentFilePath:str)->unittest.TestSuite:
|
15
|
-
paths = [x[0] for x in os.walk(os.path.dirname(currentFilePath))]
|
16
|
-
testLoader=unittest.TestLoader()
|
17
|
-
suite=unittest.TestSuite()
|
18
|
-
for modFinder, modName, _isPkg in pkgutil.walk_packages(paths):
|
19
|
-
spec=modFinder.find_spec(modName)
|
20
|
-
loader=spec.loader
|
21
|
-
module=loader.load_module(modName)
|
22
|
-
# carico ogni test presente in un modulo
|
23
|
-
for tests in testLoader.loadTestsFromModule(module):
|
24
|
-
suite.addTests(tests)
|
25
|
-
return suite
|
1
|
+
import os
|
2
|
+
import pkgutil
|
3
|
+
import unittest
|
4
|
+
|
5
|
+
|
6
|
+
class ModuloRunUnitTest(object):
|
7
|
+
|
8
|
+
@classmethod
|
9
|
+
def startTests(cls,currentFilePath:str):
|
10
|
+
suite=cls.__createTestSuite(currentFilePath)
|
11
|
+
unittest.TextTestRunner(verbosity=2).run(suite)
|
12
|
+
|
13
|
+
@staticmethod
|
14
|
+
def __createTestSuite(currentFilePath:str)->unittest.TestSuite:
|
15
|
+
paths = [x[0] for x in os.walk(os.path.dirname(currentFilePath))]
|
16
|
+
testLoader=unittest.TestLoader()
|
17
|
+
suite=unittest.TestSuite()
|
18
|
+
for modFinder, modName, _isPkg in pkgutil.walk_packages(paths):
|
19
|
+
spec=modFinder.find_spec(modName)
|
20
|
+
loader=spec.loader
|
21
|
+
module=loader.load_module(modName)
|
22
|
+
# carico ogni test presente in un modulo
|
23
|
+
for tests in testLoader.loadTestsFromModule(module):
|
24
|
+
suite.addTests(tests)
|
25
|
+
return suite
|