modulitiz-micro 2.31.0__py311-none-any.whl → 2.32.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 -58
- 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 +61 -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 +20 -20
- 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/{multithreading → multithread}/ModuloThread.py +26 -26
- modulitiz_micro/{multithreading → multithread}/ModuloThreadLogger.py +8 -8
- modulitiz_micro/{multithreading → 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/ModuloTelegram.py +52 -52
- 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 +131 -121
- modulitiz_micro/util/wheel/ModuloCheckTestNamingConvention.py +86 -0
- modulitiz_micro/util/wheel/ModuloToml.py +40 -40
- modulitiz_micro/util/wheel/ModuloWheel.py +12 -12
- {modulitiz_micro-2.31.0.dist-info → modulitiz_micro-2.32.0.dist-info}/LICENSE +21 -21
- {modulitiz_micro-2.31.0.dist-info → modulitiz_micro-2.32.0.dist-info}/METADATA +64 -64
- modulitiz_micro-2.32.0.dist-info/RECORD +104 -0
- modulitiz_micro-2.31.0.dist-info/RECORD +0 -103
- {modulitiz_micro-2.31.0.dist-info → modulitiz_micro-2.32.0.dist-info}/WHEEL +0 -0
- {modulitiz_micro-2.31.0.dist-info → modulitiz_micro-2.32.0.dist-info}/top_level.txt +0 -0
@@ -1,58 +1,70 @@
|
|
1
|
-
import
|
2
|
-
import
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
src.
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
"""
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
1
|
+
import ast
|
2
|
+
import random
|
3
|
+
import sys
|
4
|
+
|
5
|
+
from modulitiz_micro.files.ModuloFiles import ModuloFiles
|
6
|
+
|
7
|
+
|
8
|
+
class ModuloFunzioni(object):
|
9
|
+
"""
|
10
|
+
Utility riguardanti le funzioni o non catalogabili in modo definito.
|
11
|
+
"""
|
12
|
+
|
13
|
+
GENERI={'m':'Maschio','f':'Femmina'}
|
14
|
+
|
15
|
+
@staticmethod
|
16
|
+
def getFunctionName(n:int=0)->str:
|
17
|
+
"""
|
18
|
+
Per il nome della funzione corrente, non impostare nessun parametro o impostare 0;
|
19
|
+
Per il nome della funzione chiamante, impostare 1;
|
20
|
+
Per il nome della funzione chiamante la funzione, impostare 2;
|
21
|
+
E via dicendo così.
|
22
|
+
"""
|
23
|
+
return sys._getframe(n + 1).f_code.co_name
|
24
|
+
|
25
|
+
@staticmethod
|
26
|
+
def getFullyQualifiedName(funzione)->str:
|
27
|
+
"""
|
28
|
+
Ritorna il package + il nome della funzione;
|
29
|
+
in questo modo è possibile distinguere 2 funzioni con lo stesso nome, ad esempio:
|
30
|
+
src.funzione
|
31
|
+
src.package.funzione
|
32
|
+
src.package.modulo.funzione
|
33
|
+
src.package.modulo.classe.funzione
|
34
|
+
"""
|
35
|
+
return funzione.__module__+"."+funzione.__qualname__
|
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
|
+
|
46
|
+
@staticmethod
|
47
|
+
def orderDict(diz:dict)->dict:
|
48
|
+
"""
|
49
|
+
Ordina gli elementi di un dizionario.
|
50
|
+
Nota: ha senso solo se hai intenzione di esporlo all'utente sotto forma di lista.
|
51
|
+
"""
|
52
|
+
myKeys = list(diz.keys())
|
53
|
+
myKeys.sort()
|
54
|
+
newDiz = {i: diz[i] for i in myKeys}
|
55
|
+
return newDiz
|
56
|
+
|
57
|
+
@staticmethod
|
58
|
+
def dictGetFirstValue(diz: dict):
|
59
|
+
"""
|
60
|
+
Ritorna il valore del primo elemnto di un dizionario.
|
61
|
+
È ottimizzato per oggetti con molti elementi.
|
62
|
+
"""
|
63
|
+
return next(iter(diz.items()))[1]
|
64
|
+
|
65
|
+
@staticmethod
|
66
|
+
def randomBoolean()->bool:
|
67
|
+
"""
|
68
|
+
Genera un valore booleano in modo randomico.
|
69
|
+
"""
|
70
|
+
return bool(random.getrandbits(1))
|
modulitiz_micro/ModuloListe.py
CHANGED
@@ -1,150 +1,150 @@
|
|
1
|
-
import re
|
2
|
-
|
3
|
-
from modulitiz_micro.ModuloStringhe import ModuloStringhe
|
4
|
-
|
5
|
-
|
6
|
-
class ModuloListe(object):
|
7
|
-
"""
|
8
|
-
Utility di gestione degli oggetti liste.
|
9
|
-
"""
|
10
|
-
|
11
|
-
@staticmethod
|
12
|
-
def mergeListsOfDicts(listaFrom: list[dict],keyFrom: str|int,listaTo: list[dict],keyTo: str|int) -> list[dict]:
|
13
|
-
"""
|
14
|
-
Esempio: queste due liste...
|
15
|
-
[
|
16
|
-
{'index':1},
|
17
|
-
{'index':3}
|
18
|
-
]
|
19
|
-
|
20
|
-
[
|
21
|
-
{'id':1,'val':'a'},
|
22
|
-
{'id':2,'val':'b'},
|
23
|
-
{'id':3,'val':'c'},
|
24
|
-
{'id':4,'val':'d'}
|
25
|
-
]
|
26
|
-
|
27
|
-
... diventano così
|
28
|
-
|
29
|
-
[
|
30
|
-
{'id':1,'val':'a'},
|
31
|
-
{'id':3,'val':'c'}
|
32
|
-
]
|
33
|
-
"""
|
34
|
-
nuovaLista=[]
|
35
|
-
for elemFrom in listaFrom:
|
36
|
-
valore=str(elemFrom[keyFrom])
|
37
|
-
for elemTo in listaTo:
|
38
|
-
if str(elemTo[keyTo])==valore:
|
39
|
-
nuovaLista.append(elemTo)
|
40
|
-
return nuovaLista
|
41
|
-
|
42
|
-
@classmethod
|
43
|
-
def humanOrder(cls,lista: list) -> list:
|
44
|
-
"""
|
45
|
-
Ordina una lista in modo che sia più leggibile: ad esempio:
|
46
|
-
[elemento1,elemento10,elemento2]
|
47
|
-
viene ordinato in questo modo:
|
48
|
-
[elemento1,elemento2,elemento10]
|
49
|
-
invece che:
|
50
|
-
[elemento10,elemento1,elemento2]
|
51
|
-
"""
|
52
|
-
convert=lambda text:int(text) if text.isdigit() else text
|
53
|
-
alphanum=lambda key:[convert(c) for c in re.split(r'(\d+)',key)]
|
54
|
-
return sorted(lista,key=alphanum)
|
55
|
-
|
56
|
-
@staticmethod
|
57
|
-
def eliminaElementi(lista: list,elemsToRemove: list|tuple) -> list:
|
58
|
-
"""
|
59
|
-
Elimina dalla lista gli elementi specificati.
|
60
|
-
"""
|
61
|
-
for elemToRemove in elemsToRemove:
|
62
|
-
while elemToRemove in lista:
|
63
|
-
lista.remove(elemToRemove)
|
64
|
-
return lista
|
65
|
-
|
66
|
-
@classmethod
|
67
|
-
def eliminaElementiVuoti(cls,lista: list) -> list:
|
68
|
-
"""
|
69
|
-
Elimina dalla lista le stringhe vuote e gli elementi null
|
70
|
-
"""
|
71
|
-
return cls.eliminaElementi(lista,(None,""))
|
72
|
-
|
73
|
-
@staticmethod
|
74
|
-
def diff(lista1: list,lista2: list) -> tuple:
|
75
|
-
"""
|
76
|
-
Calcola la differenza tra 2 liste, mostra gli elementi che mancano dalla 1a alla 2a e viceversa.
|
77
|
-
"""
|
78
|
-
set1=set(lista1)
|
79
|
-
set2=set(lista2)
|
80
|
-
toAdd=list(set1-set2)
|
81
|
-
toRemove=list(set2-set1)
|
82
|
-
return toAdd,toRemove
|
83
|
-
|
84
|
-
@staticmethod
|
85
|
-
def affianca(lista1: list,lista2: list) -> list:
|
86
|
-
"""
|
87
|
-
Unisce 2 liste.
|
88
|
-
"""
|
89
|
-
return list(zip(lista1,lista2))
|
90
|
-
|
91
|
-
@staticmethod
|
92
|
-
def separa(lista: list) -> list:
|
93
|
-
"""
|
94
|
-
Separa 2 liste.
|
95
|
-
"""
|
96
|
-
return [list(x) for x in zip(*lista)]
|
97
|
-
|
98
|
-
@staticmethod
|
99
|
-
def chunks(lista: list,n: int):
|
100
|
-
"""
|
101
|
-
Divide una lista in una lista di liste.
|
102
|
-
"""
|
103
|
-
for i in range(0,len(lista),n):
|
104
|
-
yield lista[i:i+n]
|
105
|
-
|
106
|
-
@staticmethod
|
107
|
-
def isEmpty(lista: list) -> bool:
|
108
|
-
"""
|
109
|
-
Verifica se una lista è null o vuota.
|
110
|
-
"""
|
111
|
-
return lista is None or lista==[]
|
112
|
-
|
113
|
-
@staticmethod
|
114
|
-
def collectionContainsString(lista: list|tuple,testo: str) -> bool:
|
115
|
-
"""
|
116
|
-
Verifica se almeno un elemento di una lista o una tupla contiene una stringa.
|
117
|
-
"""
|
118
|
-
for elem in lista:
|
119
|
-
if ModuloStringhe.contains(elem,testo):
|
120
|
-
return True
|
121
|
-
return False
|
122
|
-
|
123
|
-
@staticmethod
|
124
|
-
def stringContainsCollection(testo: str,lista: list|tuple) -> bool:
|
125
|
-
"""
|
126
|
-
Verifica se una stringa contiene almeno un elemento di una lista o una tupla.
|
127
|
-
"""
|
128
|
-
for elem in lista:
|
129
|
-
if ModuloStringhe.contains(testo,elem):
|
130
|
-
return True
|
131
|
-
return False
|
132
|
-
|
133
|
-
@staticmethod
|
134
|
-
def collectionSafeGet(collection: dict|list|tuple,*keys):
|
135
|
-
"""
|
136
|
-
Ritorna elementi innestati in un dizionario, lista o tupla in una sola volta.
|
137
|
-
Se un elemento intermedio non esiste ritorna null.
|
138
|
-
Ad esempio:
|
139
|
-
'ciao' = funzione(
|
140
|
-
{'a':[('ciao',),]}
|
141
|
-
,
|
142
|
-
'a',0,0
|
143
|
-
)
|
144
|
-
"""
|
145
|
-
for key in keys:
|
146
|
-
try:
|
147
|
-
collection=collection[key]
|
148
|
-
except (IndexError,KeyError):
|
149
|
-
return
|
150
|
-
return collection
|
1
|
+
import re
|
2
|
+
|
3
|
+
from modulitiz_micro.ModuloStringhe import ModuloStringhe
|
4
|
+
|
5
|
+
|
6
|
+
class ModuloListe(object):
|
7
|
+
"""
|
8
|
+
Utility di gestione degli oggetti liste.
|
9
|
+
"""
|
10
|
+
|
11
|
+
@staticmethod
|
12
|
+
def mergeListsOfDicts(listaFrom: list[dict],keyFrom: str|int,listaTo: list[dict],keyTo: str|int) -> list[dict]:
|
13
|
+
"""
|
14
|
+
Esempio: queste due liste...
|
15
|
+
[
|
16
|
+
{'index':1},
|
17
|
+
{'index':3}
|
18
|
+
]
|
19
|
+
|
20
|
+
[
|
21
|
+
{'id':1,'val':'a'},
|
22
|
+
{'id':2,'val':'b'},
|
23
|
+
{'id':3,'val':'c'},
|
24
|
+
{'id':4,'val':'d'}
|
25
|
+
]
|
26
|
+
|
27
|
+
... diventano così
|
28
|
+
|
29
|
+
[
|
30
|
+
{'id':1,'val':'a'},
|
31
|
+
{'id':3,'val':'c'}
|
32
|
+
]
|
33
|
+
"""
|
34
|
+
nuovaLista=[]
|
35
|
+
for elemFrom in listaFrom:
|
36
|
+
valore=str(elemFrom[keyFrom])
|
37
|
+
for elemTo in listaTo:
|
38
|
+
if str(elemTo[keyTo])==valore:
|
39
|
+
nuovaLista.append(elemTo)
|
40
|
+
return nuovaLista
|
41
|
+
|
42
|
+
@classmethod
|
43
|
+
def humanOrder(cls,lista: list) -> list:
|
44
|
+
"""
|
45
|
+
Ordina una lista in modo che sia più leggibile: ad esempio:
|
46
|
+
[elemento1,elemento10,elemento2]
|
47
|
+
viene ordinato in questo modo:
|
48
|
+
[elemento1,elemento2,elemento10]
|
49
|
+
invece che:
|
50
|
+
[elemento10,elemento1,elemento2]
|
51
|
+
"""
|
52
|
+
convert=lambda text:int(text) if text.isdigit() else text
|
53
|
+
alphanum=lambda key:[convert(c) for c in re.split(r'(\d+)',key)]
|
54
|
+
return sorted(lista,key=alphanum)
|
55
|
+
|
56
|
+
@staticmethod
|
57
|
+
def eliminaElementi(lista: list,elemsToRemove: list|tuple) -> list:
|
58
|
+
"""
|
59
|
+
Elimina dalla lista gli elementi specificati.
|
60
|
+
"""
|
61
|
+
for elemToRemove in elemsToRemove:
|
62
|
+
while elemToRemove in lista:
|
63
|
+
lista.remove(elemToRemove)
|
64
|
+
return lista
|
65
|
+
|
66
|
+
@classmethod
|
67
|
+
def eliminaElementiVuoti(cls,lista: list) -> list:
|
68
|
+
"""
|
69
|
+
Elimina dalla lista le stringhe vuote e gli elementi null
|
70
|
+
"""
|
71
|
+
return cls.eliminaElementi(lista,(None,""))
|
72
|
+
|
73
|
+
@staticmethod
|
74
|
+
def diff(lista1: list,lista2: list) -> tuple:
|
75
|
+
"""
|
76
|
+
Calcola la differenza tra 2 liste, mostra gli elementi che mancano dalla 1a alla 2a e viceversa.
|
77
|
+
"""
|
78
|
+
set1=set(lista1)
|
79
|
+
set2=set(lista2)
|
80
|
+
toAdd=list(set1-set2)
|
81
|
+
toRemove=list(set2-set1)
|
82
|
+
return toAdd,toRemove
|
83
|
+
|
84
|
+
@staticmethod
|
85
|
+
def affianca(lista1: list,lista2: list) -> list:
|
86
|
+
"""
|
87
|
+
Unisce 2 liste.
|
88
|
+
"""
|
89
|
+
return list(zip(lista1,lista2))
|
90
|
+
|
91
|
+
@staticmethod
|
92
|
+
def separa(lista: list) -> list:
|
93
|
+
"""
|
94
|
+
Separa 2 liste.
|
95
|
+
"""
|
96
|
+
return [list(x) for x in zip(*lista)]
|
97
|
+
|
98
|
+
@staticmethod
|
99
|
+
def chunks(lista: list,n: int):
|
100
|
+
"""
|
101
|
+
Divide una lista in una lista di liste.
|
102
|
+
"""
|
103
|
+
for i in range(0,len(lista),n):
|
104
|
+
yield lista[i:i+n]
|
105
|
+
|
106
|
+
@staticmethod
|
107
|
+
def isEmpty(lista: list) -> bool:
|
108
|
+
"""
|
109
|
+
Verifica se una lista è null o vuota.
|
110
|
+
"""
|
111
|
+
return lista is None or lista==[]
|
112
|
+
|
113
|
+
@staticmethod
|
114
|
+
def collectionContainsString(lista: list|tuple,testo: str) -> bool:
|
115
|
+
"""
|
116
|
+
Verifica se almeno un elemento di una lista o una tupla contiene una stringa.
|
117
|
+
"""
|
118
|
+
for elem in lista:
|
119
|
+
if ModuloStringhe.contains(elem,testo):
|
120
|
+
return True
|
121
|
+
return False
|
122
|
+
|
123
|
+
@staticmethod
|
124
|
+
def stringContainsCollection(testo: str,lista: list|tuple) -> bool:
|
125
|
+
"""
|
126
|
+
Verifica se una stringa contiene almeno un elemento di una lista o una tupla.
|
127
|
+
"""
|
128
|
+
for elem in lista:
|
129
|
+
if ModuloStringhe.contains(testo,elem):
|
130
|
+
return True
|
131
|
+
return False
|
132
|
+
|
133
|
+
@staticmethod
|
134
|
+
def collectionSafeGet(collection: dict|list|tuple,*keys):
|
135
|
+
"""
|
136
|
+
Ritorna elementi innestati in un dizionario, lista o tupla in una sola volta.
|
137
|
+
Se un elemento intermedio non esiste ritorna null.
|
138
|
+
Ad esempio:
|
139
|
+
'ciao' = funzione(
|
140
|
+
{'a':[('ciao',),]}
|
141
|
+
,
|
142
|
+
'a',0,0
|
143
|
+
)
|
144
|
+
"""
|
145
|
+
for key in keys:
|
146
|
+
try:
|
147
|
+
collection=collection[key]
|
148
|
+
except (IndexError,KeyError):
|
149
|
+
return
|
150
|
+
return collection
|
modulitiz_micro/ModuloMeteo.py
CHANGED
@@ -1,72 +1,72 @@
|
|
1
|
-
import json
|
2
|
-
|
3
|
-
from modulitiz_micro.ModuloDate import ModuloDate
|
4
|
-
from modulitiz_micro.ModuloListe import ModuloListe
|
5
|
-
from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
|
6
|
-
from modulitiz_micro.files import ModuloLogging
|
7
|
-
from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
|
8
|
-
from modulitiz_micro.rete.http.ModuloHttpUtils import ModuloHttpUtils
|
9
|
-
|
10
|
-
|
11
|
-
class ModuloMeteo(object):
|
12
|
-
"""
|
13
|
-
Utility di gestione delle previsioni meteo.
|
14
|
-
"""
|
15
|
-
OPZIONI="lang=it&units=metric"
|
16
|
-
KEY="appid=e28cd365c35c12e3ed8f2d84e04398c9"
|
17
|
-
|
18
|
-
__URL_BASE="https://api.openweathermap.org"
|
19
|
-
URL_ATTUALE=__URL_BASE+f"/data/2.5/weather?{OPZIONI}&{KEY}&q="
|
20
|
-
URL_PREVISIONE=__URL_BASE+f"/data/2.5/forecast?{OPZIONI}&{KEY}&q="
|
21
|
-
|
22
|
-
def __init__(self,logger:ModuloLogging):
|
23
|
-
self.__logger=logger
|
24
|
-
|
25
|
-
def getPrevisionePioggiaFinoADomani(self,citta:str,codStato:str)->list|None:
|
26
|
-
"""
|
27
|
-
Chiede le previsioni fino al giorno dopo e mostra solo i risultati che dicono che pioverà.
|
28
|
-
"""
|
29
|
-
adesso=ModuloDate.now()
|
30
|
-
domani=ModuloDate.setEndOfDay(ModuloDate.plusMinusDays(adesso,1))
|
31
|
-
oreDiff=ModuloDate.hoursDiff(domani, adesso)
|
32
|
-
elementi=self.__getPrevisioni(citta, codStato,True,None,oreDiff)
|
33
|
-
if elementi is None:
|
34
|
-
return None
|
35
|
-
# filtro gli elementi
|
36
|
-
lista=[]
|
37
|
-
for elem in elementi:
|
38
|
-
if ModuloListe.collectionSafeGet(elem,'rain') is not None:
|
39
|
-
lista.append(elem)
|
40
|
-
return lista
|
41
|
-
|
42
|
-
def __getPrevisioni(self,citta:str,codStato:str,includiPrimaPrevisione:bool,stepHours:int|None,maxHours:int)->list|None:
|
43
|
-
cittaEStato=citta+","+codStato
|
44
|
-
url=self.URL_PREVISIONE+ModuloHttpUtils.encodeUrl(cittaEStato)
|
45
|
-
http=ModuloHttp(url,self.__logger,False)
|
46
|
-
try:
|
47
|
-
response=http.doGet(0,False)
|
48
|
-
except EccezioneHttpGeneric:
|
49
|
-
return None
|
50
|
-
responseObj=json.loads(response.responseBody)
|
51
|
-
lista=responseObj['list']
|
52
|
-
maxLista=len(lista)
|
53
|
-
# calcolo gli indici
|
54
|
-
if maxHours is not None:
|
55
|
-
maxInd=int(maxHours/3)+1
|
56
|
-
if maxInd>=maxLista:
|
57
|
-
maxInd=maxLista-1
|
58
|
-
else:
|
59
|
-
maxInd=maxLista-1
|
60
|
-
if stepHours is None:
|
61
|
-
step=1
|
62
|
-
else:
|
63
|
-
step=int(stepHours/3)
|
64
|
-
inds=list(range(4,maxInd,step))
|
65
|
-
if includiPrimaPrevisione:
|
66
|
-
inds.insert(0,1)
|
67
|
-
# processo il json
|
68
|
-
output=[]
|
69
|
-
for ind in inds:
|
70
|
-
elem=lista[ind]
|
71
|
-
output.append(elem)
|
72
|
-
return output
|
1
|
+
import json
|
2
|
+
|
3
|
+
from modulitiz_micro.ModuloDate import ModuloDate
|
4
|
+
from modulitiz_micro.ModuloListe import ModuloListe
|
5
|
+
from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
|
6
|
+
from modulitiz_micro.files import ModuloLogging
|
7
|
+
from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
|
8
|
+
from modulitiz_micro.rete.http.ModuloHttpUtils import ModuloHttpUtils
|
9
|
+
|
10
|
+
|
11
|
+
class ModuloMeteo(object):
|
12
|
+
"""
|
13
|
+
Utility di gestione delle previsioni meteo.
|
14
|
+
"""
|
15
|
+
OPZIONI="lang=it&units=metric"
|
16
|
+
KEY="appid=e28cd365c35c12e3ed8f2d84e04398c9"
|
17
|
+
|
18
|
+
__URL_BASE="https://api.openweathermap.org"
|
19
|
+
URL_ATTUALE=__URL_BASE+f"/data/2.5/weather?{OPZIONI}&{KEY}&q="
|
20
|
+
URL_PREVISIONE=__URL_BASE+f"/data/2.5/forecast?{OPZIONI}&{KEY}&q="
|
21
|
+
|
22
|
+
def __init__(self,logger:ModuloLogging):
|
23
|
+
self.__logger=logger
|
24
|
+
|
25
|
+
def getPrevisionePioggiaFinoADomani(self,citta:str,codStato:str)->list|None:
|
26
|
+
"""
|
27
|
+
Chiede le previsioni fino al giorno dopo e mostra solo i risultati che dicono che pioverà.
|
28
|
+
"""
|
29
|
+
adesso=ModuloDate.now()
|
30
|
+
domani=ModuloDate.setEndOfDay(ModuloDate.plusMinusDays(adesso,1))
|
31
|
+
oreDiff=ModuloDate.hoursDiff(domani, adesso)
|
32
|
+
elementi=self.__getPrevisioni(citta, codStato,True,None,oreDiff)
|
33
|
+
if elementi is None:
|
34
|
+
return None
|
35
|
+
# filtro gli elementi
|
36
|
+
lista=[]
|
37
|
+
for elem in elementi:
|
38
|
+
if ModuloListe.collectionSafeGet(elem,'rain') is not None:
|
39
|
+
lista.append(elem)
|
40
|
+
return lista
|
41
|
+
|
42
|
+
def __getPrevisioni(self,citta:str,codStato:str,includiPrimaPrevisione:bool,stepHours:int|None,maxHours:int)->list|None:
|
43
|
+
cittaEStato=citta+","+codStato
|
44
|
+
url=self.URL_PREVISIONE+ModuloHttpUtils.encodeUrl(cittaEStato)
|
45
|
+
http=ModuloHttp(url,self.__logger,False)
|
46
|
+
try:
|
47
|
+
response=http.doGet(0,False)
|
48
|
+
except EccezioneHttpGeneric:
|
49
|
+
return None
|
50
|
+
responseObj=json.loads(response.responseBody)
|
51
|
+
lista=responseObj['list']
|
52
|
+
maxLista=len(lista)
|
53
|
+
# calcolo gli indici
|
54
|
+
if maxHours is not None:
|
55
|
+
maxInd=int(maxHours/3)+1
|
56
|
+
if maxInd>=maxLista:
|
57
|
+
maxInd=maxLista-1
|
58
|
+
else:
|
59
|
+
maxInd=maxLista-1
|
60
|
+
if stepHours is None:
|
61
|
+
step=1
|
62
|
+
else:
|
63
|
+
step=int(stepHours/3)
|
64
|
+
inds=list(range(4,maxInd,step))
|
65
|
+
if includiPrimaPrevisione:
|
66
|
+
inds.insert(0,1)
|
67
|
+
# processo il json
|
68
|
+
output=[]
|
69
|
+
for ind in inds:
|
70
|
+
elem=lista[ind]
|
71
|
+
output.append(elem)
|
72
|
+
return output
|