modulitiz-micro 2.26.0__py311-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. modulitiz_micro/ModuloBase64.py +61 -0
  2. modulitiz_micro/ModuloColorText.py +35 -0
  3. modulitiz_micro/ModuloDate.py +295 -0
  4. modulitiz_micro/ModuloFunzioni.py +58 -0
  5. modulitiz_micro/ModuloListe.py +150 -0
  6. modulitiz_micro/ModuloMeteo.py +72 -0
  7. modulitiz_micro/ModuloNumeri.py +130 -0
  8. modulitiz_micro/ModuloPyinstaller.py +29 -0
  9. modulitiz_micro/ModuloSeriale.py +61 -0
  10. modulitiz_micro/ModuloStatistiche.py +31 -0
  11. modulitiz_micro/ModuloStringhe.py +180 -0
  12. modulitiz_micro/ModuloTarghe.py +46 -0
  13. modulitiz_micro/android/ModuloAndroid.py +18 -0
  14. modulitiz_micro/android/ModuloAndroidAdb.py +48 -0
  15. modulitiz_micro/android/ModuloAndroidSim.py +130 -0
  16. modulitiz_micro/android/beans/SmsBean.py +12 -0
  17. modulitiz_micro/android/enums/AndroidSmsTypeEnum.py +17 -0
  18. modulitiz_micro/database/AbstractDatabaseService.py +13 -0
  19. modulitiz_micro/database/AbstractSql.py +49 -0
  20. modulitiz_micro/database/ModuloSqlOracle.py +19 -0
  21. modulitiz_micro/database/ModuloSqlServer.py +50 -0
  22. modulitiz_micro/database/eccezioni/EccezioneDbNoData.py +6 -0
  23. modulitiz_micro/database/mysql/AbstractBasicMysql.py +114 -0
  24. modulitiz_micro/database/mysql/ModuloMysql.py +151 -0
  25. modulitiz_micro/database/mysql/MysqlCommonConverter.py +47 -0
  26. modulitiz_micro/database/mysql/eccezioni/EccezioneMysqlOffline.py +6 -0
  27. modulitiz_micro/database/sqlite/AbstractBasicSQLite.py +114 -0
  28. modulitiz_micro/database/sqlite/ModuloSQLite.py +82 -0
  29. modulitiz_micro/eccezioni/EccezioneBase.py +7 -0
  30. modulitiz_micro/eccezioni/EccezioneCtrlC.py +7 -0
  31. modulitiz_micro/eccezioni/EccezioneRuntime.py +7 -0
  32. modulitiz_micro/eccezioni/EccezioneScheduler.py +7 -0
  33. modulitiz_micro/eccezioni/EccezioneSoNonSupportato.py +7 -0
  34. modulitiz_micro/eccezioni/http/EccezioneHttp.py +8 -0
  35. modulitiz_micro/eccezioni/http/EccezioneHttp404.py +7 -0
  36. modulitiz_micro/eccezioni/http/EccezioneHttpGeneric.py +7 -0
  37. modulitiz_micro/files/ModuloFiles.py +173 -0
  38. modulitiz_micro/files/ModuloLogging.py +69 -0
  39. modulitiz_micro/files/ModuloZip.py +42 -0
  40. modulitiz_micro/files/cache/CacheBean.py +5 -0
  41. modulitiz_micro/files/cache/CacheRam.py +29 -0
  42. modulitiz_micro/files/cache/DatabaseCache.py +91 -0
  43. modulitiz_micro/files/cache/decorators/cacheRam.py +26 -0
  44. modulitiz_micro/files/git/ModuloGit.py +15 -0
  45. modulitiz_micro/gestionedom/GestioneDom.py +44 -0
  46. modulitiz_micro/init/AbstractBasicInit.py +27 -0
  47. modulitiz_micro/init/AbstractInit.py +11 -0
  48. modulitiz_micro/keylogger/EccezioneKeyLogger.py +7 -0
  49. modulitiz_micro/keylogger/ModuloKeylogger.py +73 -0
  50. modulitiz_micro/multithreading/ModuloThread.py +26 -0
  51. modulitiz_micro/multithreading/ModuloThreadLogger.py +8 -0
  52. modulitiz_micro/multithreading/ModuloThreadWithCallbackError.py +25 -0
  53. modulitiz_micro/nlp/ModuloNlp.py +36 -0
  54. modulitiz_micro/nlp/ModuloNlpDateAndTime.py +59 -0
  55. modulitiz_micro/rete/ModuloEmail.py +69 -0
  56. modulitiz_micro/rete/ModuloNetworking.py +64 -0
  57. modulitiz_micro/rete/ModuloOpenVpn.py +15 -0
  58. modulitiz_micro/rete/http/ModuloHttp.py +114 -0
  59. modulitiz_micro/rete/http/ModuloHttpConnectionSafe.py +91 -0
  60. modulitiz_micro/rete/http/ModuloHttpUtils.py +66 -0
  61. modulitiz_micro/rete/http/beans/HttpResponseBean.py +5 -0
  62. modulitiz_micro/rete/http/decorators/catchAndRaiseHttpExceptions.py +22 -0
  63. modulitiz_micro/rete/ntp/AbstractModuloNtp.py +73 -0
  64. modulitiz_micro/rete/ntp/ModuloNtpIt.py +8 -0
  65. modulitiz_micro/rete/socketserver/AbstractBasicGetSocketServer.py +35 -0
  66. modulitiz_micro/rete/socketserver/AbstractSocketServer.py +267 -0
  67. modulitiz_micro/rete/ssl/ModuloSsl.py +56 -0
  68. modulitiz_micro/sistema/EnvVarsEnum.py +9 -0
  69. modulitiz_micro/sistema/ModuloEnvVars.py +34 -0
  70. modulitiz_micro/sistema/ModuloSystem.py +298 -0
  71. modulitiz_micro/sistema/ModuloSystemPipe.py +67 -0
  72. modulitiz_micro/social/telegram/ModuloTelegram.py +52 -0
  73. modulitiz_micro/social/telegram/ModuloTelegramSimple.py +26 -0
  74. modulitiz_micro/util/beans/conf/AbstractBasicConfBean.py +11 -0
  75. modulitiz_micro/util/beans/conf/AbstractConfBean.py +16 -0
  76. modulitiz_micro/util/beans/fileconf/AbstractBasicFileConfBean.py +11 -0
  77. modulitiz_micro/util/beans/fileconf/AbstractFileConfBean.py +13 -0
  78. modulitiz_micro/util/beans/globalvar/AbstractBasicGlobalVarBean.py +15 -0
  79. modulitiz_micro/util/beans/globalvar/AbstractGlobalVarBean.py +34 -0
  80. modulitiz_micro/util/decorators/noAwait.py +23 -0
  81. modulitiz_micro/util/pip/AbstractModuloPip.py +41 -0
  82. modulitiz_micro/util/pip/ModuloPip.py +49 -0
  83. modulitiz_micro/util/scheduler/AbstractScheduler.py +32 -0
  84. modulitiz_micro/util/spooler/AbstractSpooler.py +14 -0
  85. modulitiz_micro/util/spooler/Spooler.py +18 -0
  86. modulitiz_micro/util/spooler/beans/QueueBean.py +8 -0
  87. modulitiz_micro/util/spooler/decorators/spooler.py +49 -0
  88. modulitiz_micro/util/spooler/eccezioni/EccezioneSpooler.py +7 -0
  89. modulitiz_micro/util/spooler/eccezioni/EccezioneSpoolerFull.py +7 -0
  90. modulitiz_micro/util/unittesting/AbstractOverrideTestUtil.py +18 -0
  91. modulitiz_micro/util/unittesting/AbstractTestUtil.py +11 -0
  92. modulitiz_micro/util/unittesting/ModuloRunUnitTest.py +25 -0
  93. modulitiz_micro/util/wheel/ModuloBuildWheel.py +118 -0
  94. modulitiz_micro/util/wheel/ModuloToml.py +40 -0
  95. modulitiz_micro/util/wheel/ModuloWheel.py +12 -0
  96. modulitiz_micro-2.26.0.dist-info/LICENSE +21 -0
  97. modulitiz_micro-2.26.0.dist-info/METADATA +63 -0
  98. modulitiz_micro-2.26.0.dist-info/RECORD +100 -0
  99. modulitiz_micro-2.26.0.dist-info/WHEEL +5 -0
  100. modulitiz_micro-2.26.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,130 @@
1
+ class ModuloNumeri(object):
2
+ """
3
+ Utility di gestione dei numeri, sia interi (senza virgola) che floating-point (con decimali) che con o senza segno.
4
+ """
5
+
6
+ UNO_DIVISO_1024=0.0009765625
7
+
8
+ NUMERI_CARDINALI={
9
+ 0:"zero",
10
+ 1:"uno",
11
+ 2:"due",
12
+ 3:"tre",
13
+ 4:"quattro",
14
+ 5:"cinque",
15
+ 6:"sei",
16
+ 7:"sette",
17
+ 8:"otto",
18
+ 9:"nove",
19
+ 10:"dieci",
20
+ 11:"undici"
21
+ }
22
+
23
+ NUMERI_ORDINALI={
24
+ "primo":1,
25
+ }
26
+
27
+ @staticmethod
28
+ def isInt(valore)->bool:
29
+ """
30
+ Determina se un valore può essere considerato un numero intero.
31
+ """
32
+ try:
33
+ int(valore)
34
+ return True
35
+ except ValueError:
36
+ return False
37
+
38
+ @staticmethod
39
+ def isFloat(valore)->bool:
40
+ """
41
+ Determina se un valore può essere considerato un numero con la virgola.
42
+ """
43
+ try:
44
+ float(valore)
45
+ return True
46
+ except ValueError:
47
+ return False
48
+
49
+ @staticmethod
50
+ def strToInt(valore:str)->int|None:
51
+ """
52
+ Converte una stringa in numero intero.
53
+ """
54
+ try:
55
+ ris=int(valore)
56
+ return ris
57
+ except ValueError:
58
+ return None
59
+
60
+ @staticmethod
61
+ def intToBool(valore:int)->bool:
62
+ """
63
+ Converte un numero intero in valore booleano (o binario).
64
+ """
65
+ if int(valore)==1:
66
+ return True
67
+ return False
68
+
69
+ @staticmethod
70
+ def boolToInt(valore:bool)->int:
71
+ """
72
+ Converte un valore booleano (o binario) in numero intero.
73
+ """
74
+ return int(valore)
75
+
76
+ @classmethod
77
+ def byteToKilobyte(cls,byte:int)->int:
78
+ """
79
+ Converte un numero di byte in KB
80
+ """
81
+ return int(byte*cls.UNO_DIVISO_1024)
82
+ @classmethod
83
+ def byteToMegabyte(cls,byte:int)->int:
84
+ """
85
+ Converte un numero di byte in MB
86
+ """
87
+ return int(cls.byteToKilobyte(byte)*cls.UNO_DIVISO_1024)
88
+
89
+ @classmethod
90
+ def versionStrToInt(cls,testo:str)->int:
91
+ """
92
+ Converte la stringa di una versione in intero.
93
+ NB: la versione andrebbe sempre trattata come una stringa.
94
+ """
95
+ arr=testo.split(".")
96
+ testoPadded="".join([x.ljust(4,"0") for x in arr])
97
+ return cls.strToInt(testoPadded)
98
+
99
+ @staticmethod
100
+ def humanFormat(num: int) -> str:
101
+ """
102
+ Formatta un numero in modo che sia più leggibile.
103
+ """
104
+ magnitude=0
105
+ while abs(num)>=1000:
106
+ magnitude+=1
107
+ num/=1000.0
108
+ return '%.2f%s'%(num,['','K','M','G','T','P'][magnitude])
109
+
110
+ @staticmethod
111
+ def decimalNumbersTruncate(value:float,decimals:int)->float:
112
+ """
113
+ Rimuove la quantità di decimali voluta da un valore.
114
+ Il valore 1.234 se viene troncato a 2 decimali diventa 1.23
115
+ """
116
+ factor=10**decimals
117
+ return int(value*factor)/factor
118
+
119
+ @classmethod
120
+ def numberToWord(cls,numero:int)->str:
121
+ """
122
+ Converte un numero in parola.
123
+ """
124
+ return cls.NUMERI_CARDINALI[numero]
125
+ @classmethod
126
+ def wordToNumber(cls,parola:str)->int:
127
+ """
128
+ Converte una parola in numero.
129
+ """
130
+ return cls.NUMERI_ORDINALI[parola]
@@ -0,0 +1,29 @@
1
+ import os
2
+ import sys
3
+
4
+ from modulitiz_micro.files.ModuloFiles import ModuloFiles
5
+
6
+
7
+ class ModuloPyinstaller(object):
8
+ """
9
+ Utility di gestione del modulo che permette di compilare sorgenti e interprete in un file eseguibile unico (exe)
10
+ """
11
+
12
+ @staticmethod
13
+ def isExecutableMode()->bool:
14
+ """
15
+ Identifica se lo script viene eseguito da un eseguibile o meno.
16
+ """
17
+ return getattr(sys, 'frozen', False)
18
+
19
+ @classmethod
20
+ def cdProjectsDir(cls):
21
+ """
22
+ Se questo metodo non viene chiamato da un eseguibile costruito con PyInstaller fa nulla,
23
+ altrimenti cambia la cartella corrente alla root dei progetti.
24
+ """
25
+ if cls.isExecutableMode() is False:
26
+ return
27
+ pathExecutableDir=os.path.dirname(sys.executable)
28
+ originalPath=os.path.abspath(ModuloFiles.pathJoin(pathExecutableDir,"../"))
29
+ os.chdir(originalPath)
@@ -0,0 +1,61 @@
1
+ import serial
2
+
3
+ from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
4
+
5
+
6
+ class ModuloSeriale(object):
7
+ """
8
+ Utility di gestione dela connessione seriale RS232
9
+ """
10
+
11
+ COM_PORTS=[]
12
+
13
+ def __init__(self):
14
+ self.connessione=None
15
+
16
+ @classmethod
17
+ def populate(cls):
18
+ """
19
+ Popola le variabili di classe.
20
+ """
21
+ if ModuloSystem.isWindows():
22
+ COM_PORTS=cls.__generaElencoPorte("COM",1)
23
+ else:
24
+ COM_PORTS=cls.__generaElencoPorte("/dev/tty",0)
25
+ COM_PORTS.extend(cls.__generaElencoPorte("/dev/ttyS",0))
26
+ COM_PORTS.extend(cls.__generaElencoPorte("/dev/ttyUSB",0))
27
+ cls.COM_PORTS=COM_PORTS
28
+
29
+ def apriPrimaPortaDisponibile(self):
30
+ """
31
+ Prova ad aprire la prima porta disponibile che trova.
32
+ """
33
+ for porta in self.COM_PORTS:
34
+ try:
35
+ connessioneSeriale=serial.Serial(port=porta, baudrate=9600, rtscts=True, dsrdtr=True, exclusive=True)
36
+ connessioneSeriale.dtr=True
37
+ connessioneSeriale.dtr=False
38
+ self.connessione=connessioneSeriale
39
+ return
40
+ except (OSError,serial.SerialException):
41
+ pass
42
+
43
+ def isOpen(self)->bool:
44
+ """
45
+ Controlla se la connessione alla porta è aperta.
46
+ """
47
+ return self.connessione is not None and self.connessione.isOpen()
48
+
49
+ def close(self):
50
+ """
51
+ Chiude la connessione alla porta.
52
+ """
53
+ if not self.isOpen():
54
+ return
55
+ self.connessione.close()
56
+ self.connessione=None
57
+
58
+ @staticmethod
59
+ def __generaElencoPorte(prefisso:str,inizio:int)->list:
60
+ return [prefisso+str(i) for i in range(inizio,16)]
61
+
@@ -0,0 +1,31 @@
1
+ from modulitiz_micro.ModuloDate import ModuloDate
2
+ from modulitiz_micro.ModuloNumeri import ModuloNumeri
3
+
4
+
5
+ class ModuloStatistiche(object):
6
+ """
7
+ Utility per la gestione delle statistiche.
8
+ """
9
+
10
+ @staticmethod
11
+ def calcolaProgresso(index:int, contaElementiElaborati:int, totElementi:int, secsInizio:int)->str:
12
+ """
13
+ Calcola il tempo rimanente alla fine dell'elaborazione di un certo numero di elementi in base al trend attuale.
14
+ :param index: deve partire da 0
15
+ :param contaElementiElaborati: deve partire da 1
16
+ :param totElementi: numero totale di elementi
17
+ :param secsInizio: timestamp di inizio elaborazione
18
+ """
19
+ secsFine=ModuloDate.getSecs()
20
+ percentuale=int((index*100) / totElementi)
21
+
22
+ secondiTrascorsi=secsFine - secsInizio
23
+ elementiRimanenti=totElementi - index
24
+ secondiRimanenti=int((secondiTrascorsi / contaElementiElaborati) * elementiRimanenti)
25
+ tempoRimanente=ModuloDate.dateToString(ModuloDate.timestampUtcToDate(secondiRimanenti),ModuloDate.FORMATO_ORA)
26
+
27
+ # se i numeri sono alti li conveto in un formato più leggibile
28
+ index=ModuloNumeri.humanFormat(index)
29
+ totElementi=ModuloNumeri.humanFormat(totElementi)
30
+ msg="Progresso: {:<5}/{}, percentuale: {:<3}%, tempo rimanente: {}".format(index, totElementi, percentuale, tempoRimanente)
31
+ return msg
@@ -0,0 +1,180 @@
1
+ import locale
2
+ import random
3
+ import string
4
+
5
+ from modulitiz_micro.ModuloDate import ModuloDate
6
+
7
+
8
+ class ModuloStringhe(object):
9
+ """
10
+ Utility di gestione delle stringhe.
11
+ """
12
+
13
+ CODIFICA_ASCII="ascii"
14
+ CODIFICA_LATIN1="latin_1"
15
+ CODIFICA_UTF8="utf-8"
16
+
17
+ SEP=r"//||//"
18
+
19
+ @classmethod
20
+ def setLocaleItalian(cls):
21
+ """
22
+ Necessario per avere, ad esempio, il giorno della settimana nella lingua corretta.
23
+ """
24
+ cls.setLocale("it_IT")
25
+
26
+ @classmethod
27
+ def setLocale(cls,lang:str):
28
+ """
29
+ Imposta la lingua predefinita.
30
+ """
31
+ try:
32
+ cls.__setLocale(lang)
33
+ except locale.Error:
34
+ lang+=".utf8"
35
+ cls.__setLocale(lang)
36
+
37
+ @staticmethod
38
+ def __setLocale(lang:str):
39
+ locale.setlocale(locale.LC_TIME, lang)
40
+
41
+ @staticmethod
42
+ def isEmpty(val:str)->bool:
43
+ """
44
+ Verifica se il valore passato in input è NULL o vuoto.
45
+ """
46
+ if val is None:
47
+ return True
48
+ val=str(val)
49
+ return val==''
50
+
51
+ @staticmethod
52
+ def contains(haystack:str,needle:str)->bool:
53
+ """
54
+ Verifica se un testo è contenuto in un altro testo.
55
+ :param haystack: testo contenitore
56
+ :param needle: testo da cercare
57
+ """
58
+ return haystack.find(needle)!=-1
59
+
60
+ @staticmethod
61
+ def normalizzaEol(cont:str)->str:
62
+ """
63
+ Converte i caratteri di fine riga secondo lo standard Unix (universale)
64
+ """
65
+ cont=cont.replace("\r\n","\n")
66
+ cont=cont.replace("\r","\n")
67
+ return cont
68
+
69
+ @staticmethod
70
+ def normalizzaTrattini(testo:str)->str:
71
+ """
72
+ Tutti i caratteri assimilabili come un trattino vengono convertiti in trattini.
73
+ """
74
+ #https://en.wikipedia.org/wiki/Dash#Common_dashes_and_Unicode_characters
75
+ testo=testo.replace(u'\u2012',"-") #figure dash
76
+ testo=testo.replace(u'\u2013',"-") #en dash
77
+ testo=testo.replace(u'\u2014',"-") #em dash
78
+ testo=testo.replace(u'\u2015',"-") #horizontal bar
79
+ #https://en.wikipedia.org/wiki/Hyphen#Unicode
80
+ testo=testo.replace(u'\u002D',"-") #HYPHEN-MINUS
81
+ testo=testo.replace(u'\u2212',"-") #MINUS SIGN
82
+ testo=testo.replace(u'\u00AD',"-") #SOFT HYPHEN
83
+ testo=testo.replace(u'\u2010',"-") #HYPHEN
84
+ testo=testo.replace(u'\u2011',"-") #NON-BREAKING HYPHEN
85
+ testo=testo.replace(u'\u0584',"-") #ARMENIAN HYPHEN
86
+ testo=testo.replace(u'\u1806',"-") #MONGOLIAN SOFT HYPHEN
87
+ testo=testo.replace(u'\uFE63',"-") #SMALL HYPHEN-MINUS
88
+ testo=testo.replace(u'\uFF0D',"-") #FULLWIDTH HYPHEN-MINUS
89
+ testo=testo.replace(u'\u2043',"-") #HYPHEN BULLET
90
+ return testo
91
+
92
+ @staticmethod
93
+ def normalizzaCaratteriSpeciali(testo:str)->str:
94
+ """
95
+ Normalizzazione altri caratteri speciali.
96
+ """
97
+ testo=testo.replace(u'\u039b','&') #GREEK CAPITAL LETTER LAMDA
98
+ return testo
99
+
100
+ @classmethod
101
+ def aggiungiTimestamp(cls,nomefile:str)->str:
102
+ """
103
+ Se il nome del file ha l'estensione aggiungo il timestamp prima dell'estensione
104
+ """
105
+ timestamp=ModuloDate.dateToString(None,ModuloDate.FORMATO_DATA_ORA_NOSPAZI)
106
+ if not cls.contains(nomefile,"."):
107
+ return nomefile+"_"+timestamp
108
+ arr=nomefile.split(".")
109
+ nuovonome=".".join(arr[0:-1])+"_"+timestamp+"."+arr[-1]
110
+ return nuovonome
111
+
112
+ @classmethod
113
+ def phoneNumberFormat(cls,stringa:str,sep:str):
114
+ """
115
+ Formatta un numero di telefono rendendolo più facile da leggere.
116
+ """
117
+ return cls.insertCharEveryN(stringa,sep,3)
118
+
119
+ @staticmethod
120
+ def capitalizeEveryWord(text:str)->str:
121
+ """
122
+ Converte in maiuscolo il primo carattere di ogni parola.
123
+ """
124
+ arr=text.split(" ")
125
+ arrNew=[x.capitalize() for x in arr]
126
+ textNew=" ".join(arrNew)
127
+ return textNew
128
+
129
+ @staticmethod
130
+ def splitColonne(text:str,sep:str)->list:
131
+ """
132
+ Divide una stringa in colonne, ad ogni colonna vengono tolti gli spazi all'inizio e alla fine.
133
+ """
134
+ colonne=text.split(sep)
135
+ colonne=[x.strip() for x in colonne]
136
+ return colonne
137
+
138
+ @staticmethod
139
+ def randomString(useLower:bool,useUpper:bool,useDigits:bool,length:int)->str:
140
+ """
141
+ Crea una stringa di caratteri e/o numeri di lunghezza configurabile.
142
+ """
143
+ chars=""
144
+ if useLower:
145
+ chars+=string.ascii_lowercase
146
+ if useUpper:
147
+ chars+=string.ascii_uppercase
148
+ if useDigits:
149
+ chars+=string.digits
150
+ return ''.join(random.choices(chars, k=length))
151
+
152
+ @staticmethod
153
+ def insertCharEveryN(stringa:str,sep:str,everyN:int)->str:
154
+ """
155
+ Inserisce un carattere o un testo ogni N caratteri di un altro testo.
156
+ """
157
+ return sep.join(stringa[i:i+everyN] for i in range(0, len(stringa), everyN))
158
+
159
+ @staticmethod
160
+ def trovaCodificaCorretta(textBytes:bytes,expectedText:str)->list:
161
+ """
162
+ Questa funzione non ti puo' dire se la codifica e' corretta,
163
+ devi verificarlo tu a occhio perche' piu' codifiche possono andare bene.
164
+ """
165
+ # questa variabile la lascio qui dentro perche' e' pesante
166
+ codecs=('ascii','big5','big5hkscs','cp037','cp424','cp437','cp500','cp737','cp775','cp850','cp852','cp855','cp856','cp857','cp860','cp861','cp862','cp863','cp864','cp865','cp866',
167
+ 'cp869','cp874','cp875','cp932','cp949','cp950','cp1006','cp1026','cp1140','cp1250','cp1251','cp1252','cp1253','cp1254','cp1255','cp1256','cp1257','cp1258','euc_jp',
168
+ 'euc_jis_2004','euc_jisx0213','euc_kr','gb2312','gbk','gb18030','hz','iso2022_jp','iso2022_jp_1','iso2022_jp_2','iso2022_jp_2004','iso2022_jp_3','iso2022_jp_ext','iso2022_kr',
169
+ 'latin_1','iso8859_2','iso8859_3','iso8859_4','iso8859_5','iso8859_6','iso8859_7','iso8859_8','iso8859_9','iso8859_10','iso8859_13','iso8859_14','iso8859_15','johab','koi8_r',
170
+ 'koi8_u','mac_cyrillic','mac_greek','mac_iceland','mac_latin2','mac_roman','mac_turkish','ptcp154','shift_jis','shift_jis_2004','shift_jisx0213','utf_16','utf_16_be','utf_16_le',
171
+ 'utf_7','utf_8','utf_8_sig')
172
+ results=[]
173
+ for codec in codecs:
174
+ try:
175
+ testo=textBytes.decode(codec)
176
+ if testo==expectedText:
177
+ results.append(codec)
178
+ except UnicodeDecodeError:
179
+ pass
180
+ return results
@@ -0,0 +1,46 @@
1
+ from modulitiz_micro.ModuloNumeri import ModuloNumeri
2
+ from modulitiz_micro.ModuloStringhe import ModuloStringhe
3
+ from modulitiz_micro.gestionedom.GestioneDom import GestioneDom
4
+ from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
5
+
6
+
7
+ class ModuloTarghe(object):
8
+ """
9
+ Utility di gestione delle targhe delle auto.
10
+ """
11
+
12
+ URL="https://autokar.it/targhe"
13
+
14
+ @classmethod
15
+ def getAnno(cls,targa:str)->int|None:
16
+ """
17
+ Cerca la targa e restituisce approssimativamente l'anno di immatricolazione.
18
+ :param targa: la targa dell'auto da cercare.
19
+ """
20
+ http=ModuloHttp(cls.URL,None,False)
21
+ responseBody=http.doGet(3,True).responseBody.decode(ModuloStringhe.CODIFICA_LATIN1)
22
+ gestioneDom=GestioneDom(None,responseBody)
23
+ elementi=gestioneDom.selector(".entry-content p")
24
+ targaIniziale=targa[:2]
25
+ for elem in elementi:
26
+ anno=cls.__getAnno(elem,targaIniziale)
27
+ if anno is not None:
28
+ return anno
29
+
30
+ @classmethod
31
+ def __getAnno(cls,tag,targaIniziale:str)->int|None:
32
+ elementi=tag.contents
33
+ if len(elementi)!=2:
34
+ return None
35
+ try:
36
+ testo=elementi[0].contents[0]
37
+ except AttributeError:
38
+ return None
39
+ if targaIniziale!=testo:
40
+ return None
41
+ annoStr=elementi[1].strip()
42
+ anno=ModuloNumeri.strToInt(annoStr)
43
+ if anno is not None:
44
+ return anno
45
+ anno=int(annoStr.split(" ")[0])
46
+ return anno
@@ -0,0 +1,18 @@
1
+ from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
2
+
3
+
4
+ class ModuloAndroid(object):
5
+ @staticmethod
6
+ def isAaptInstalled()->bool:
7
+ return ModuloSystem.isAptPackageInstalled("aapt")
8
+ @staticmethod
9
+ def isAdbInstalled()->bool:
10
+ return ModuloSystem.isAptPackageInstalled("adb")
11
+
12
+ @staticmethod
13
+ def getApkVersionName(nomefile:str)->str|None:
14
+ if not ModuloAndroid.isAaptInstalled():
15
+ return None
16
+ cmd=rf'''aapt dump badging {nomefile} | grep "versionName" | sed -e "s/.*versionName='//" -e "s/' .*//"'''
17
+ output=ModuloSystem.systemCallReturnOutput(cmd,None)
18
+ return output
@@ -0,0 +1,48 @@
1
+ from modulitiz_micro.ModuloStringhe import ModuloStringhe
2
+ from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
3
+
4
+
5
+ class ModuloAndroidAdb(object):
6
+ """
7
+ deviceId puo' essere l'identificativo:
8
+ - del dispositivo di 16 caratteri esadecimale
9
+ - della porta usb, del prodotto, del modello, ... (vedi il comando 'adb devices -l')
10
+ il transport_id non e' supportato
11
+ """
12
+
13
+ def __init__(self,deviceId:str):
14
+ self.deviceId=deviceId
15
+
16
+ def isDeviceConnected(self)->bool:
17
+ cmd=r'adb -s "%s" get-state'%(self.deviceId,)
18
+ return self.__retrieveLastLineOfOutput(cmd)=='device'
19
+
20
+ def isDeviceUnlocked(self)->bool:
21
+ cmd=r'adb -s "%s" shell dumpsys window | grep mDreamingLockscreen'%(self.deviceId,)
22
+ output=ModuloSystem.systemCallReturnOutput(cmd,None).strip()
23
+ valori=[x.split("=")[1] for x in output.split(" ")]
24
+ for valore in valori:
25
+ if valore=="true":
26
+ return False
27
+ return True
28
+
29
+ def reboot(self)->bool:
30
+ cmd=r'adb -s "%s" reboot'%(self.deviceId,)
31
+ return self.__retrieveLastLineOfOutput(cmd)==''
32
+ def shutdown(self)->bool:
33
+ cmd=r'adb -s "%s" reboot -p'%(self.deviceId,)
34
+ return self.__retrieveLastLineOfOutput(cmd)=='Done'
35
+
36
+ @classmethod
37
+ def closeServer(cls) -> bool:
38
+ cmd="adb kill-server"
39
+ return cls.__retrieveOutput(cmd)==''
40
+
41
+ @staticmethod
42
+ def __retrieveOutput(cmd)->str:
43
+ return ModuloStringhe.normalizzaEol(ModuloSystem.systemCallReturnOutput(cmd,None)).strip()
44
+ @classmethod
45
+ def __retrieveLastLineOfOutput(cls,cmd)->str:
46
+ output=cls.__retrieveOutput(cmd)
47
+ righe=output.split("\n")
48
+ return righe[-1]
@@ -0,0 +1,130 @@
1
+ import time
2
+
3
+ from modulitiz_micro.ModuloDate import ModuloDate
4
+ from modulitiz_micro.ModuloListe import ModuloListe
5
+ from modulitiz_micro.ModuloNumeri import ModuloNumeri
6
+ from modulitiz_micro.ModuloStringhe import ModuloStringhe
7
+ from modulitiz_micro.sistema.ModuloSystem import ModuloSystem
8
+
9
+
10
+ class ModuloAndroidSim(object):
11
+ """
12
+ CREATE TABLE sms (
13
+ _id INTEGER PRIMARY KEY
14
+ thread_id INTEGER
15
+ address TEXT
16
+ person INTEGER
17
+ date INTEGER
18
+ date_sent INTEGER DEFAULT 0
19
+ protocol INTEGER
20
+ read INTEGER DEFAULT 0
21
+ status INTEGER DEFAULT -1
22
+ type INTEGER
23
+ reply_path_present INTEGER
24
+ subject TEXT
25
+ body TEXT
26
+ service_center TEXT
27
+ locked INTEGER DEFAULT 0
28
+ sub_id INTEGER DEFAULT INVALID_SUBSCRIPTION_ID
29
+ error_code INTEGER DEFAULT NO_ERROR_CODE
30
+ creator TEXT
31
+ seen INTEGER DEFAULT 0
32
+ );
33
+ """
34
+
35
+ def __init__(self,deviceId:str):
36
+ self.deviceId=deviceId
37
+
38
+ self.__SEP_WITH_DELIM=(r''' "'"\"%s"\"'" '''%(ModuloStringhe.SEP.replace(r"|",r"\|"),)).strip()
39
+
40
+ def hasDeviceCellSignal(self)->bool:
41
+ cmd=r'adb -s "%s" shell "dumpsys telephony.registry | grep mServiceState"'%(self.deviceId,)
42
+ output=ModuloStringhe.normalizzaEol(ModuloSystem.systemCallReturnOutput(cmd,None)).strip()
43
+ ind=output.find("=")
44
+ if ind==-1:
45
+ return False
46
+ serviceState=output[ind+1]
47
+ if not ModuloNumeri.isInt(serviceState):
48
+ return False
49
+ return int(serviceState)==0
50
+
51
+ # operazioni di lettura
52
+ def smsRead(self,onlyUnread:bool)->list:
53
+ """
54
+ Tutti i comandi che fanno operazioni di SELECT, UPDATE o DELETE richiedono il ROOT
55
+ """
56
+ sql=self.__smsQuery(onlyUnread,False)
57
+ output=self.__querySmsDb(sql)
58
+ return ModuloListe.eliminaElementiVuoti(output.split("|"+ModuloStringhe.SEP+"\n"))
59
+
60
+ def smsReadUntilNew(self,checkEverySecs:int|float,timeoutMin:int|float) -> list:
61
+ """
62
+ Aspetta l'arrivo di un nuovo messaggio.
63
+ Questo metodo NON è asincrono.
64
+ """
65
+ timeoutSecs=timeoutMin*60
66
+ tsStart=ModuloDate.getSecs()
67
+ results=[]
68
+ while ModuloListe.isEmpty(results) and (ModuloDate.getSecs()-tsStart)<timeoutSecs:
69
+ time.sleep(checkEverySecs)
70
+ results=self.smsRead(True)
71
+ return results
72
+
73
+ def smsReadCount(self,onlyUnread: bool) -> int:
74
+ """
75
+ Tutti i comandi che fanno operazioni di SELECT, UPDATE o DELETE richiedono il ROOT
76
+ """
77
+ sql=self.__smsQuery(onlyUnread,True)
78
+ output=self.__querySmsDb(sql)
79
+ return int(output)
80
+
81
+ def __smsQuery(self,onlyUnread:bool,isCount:bool)->str:
82
+ sqlSelect="COUNT(*)" if isCount else "*,%s AS sep"%(self.__SEP_WITH_DELIM,)
83
+ sql="SELECT %s FROM sms WHERE 1=1 %s;"%(sqlSelect,("AND read=0" if onlyUnread else ""),)
84
+ return sql
85
+
86
+ # operazioni di modifica / cancellazione
87
+ def smsDelete(self,idSms:int)->str:
88
+ """
89
+ Tutti i comandi che fanno operazioni di SELECT, UPDATE o DELETE richiedono il ROOT
90
+ """
91
+ sql="DELETE FROM sms WHERE _id=%d;"%(idSms,)
92
+ return self.__querySmsDb(sql)
93
+ def smsUpdateAsRed(self,idSms:int)->str:
94
+ """
95
+ Tutti i comandi che fanno operazioni di SELECT, UPDATE o DELETE richiedono il ROOT
96
+ """
97
+ sql="UPDATE sms SET read=1 WHERE _id=%d AND read=0;"%(idSms,)
98
+ return self.__querySmsDb(sql)
99
+ def smsUpdateManyAsRed(self,idsSms:list[int])->str|None:
100
+ """
101
+ Tutti i comandi che fanno operazioni di SELECT, UPDATE o DELETE richiedono il ROOT
102
+ """
103
+ if not idsSms:
104
+ return None
105
+ idsSmsStr=",".join(str(x) for x in idsSms)
106
+ sql="UPDATE sms SET read=1 WHERE _id IN(%s) AND read=0;"%(idsSmsStr,)
107
+ return self.__querySmsDb(sql)
108
+
109
+ def __querySmsDb(self,sqlQuery:str)->str:
110
+ """
111
+ Richiede il ROOT sul device
112
+ """
113
+ cmd=r'''adb -s "%s" shell "su -c 'sqlite3 "/data/data/com.android.providers.telephony/databases/mmssms.db" \"%s\"'" '''%(self.deviceId,sqlQuery)
114
+ output=ModuloSystem.systemCallReturnOutput(cmd,None).strip()
115
+ output=ModuloStringhe.normalizzaEol(output)
116
+ return output
117
+
118
+ def smsSend(self,unlockPin:int,numeroDest:str,msg:str)->str:
119
+ msg=msg.replace(" ",r"\ ")
120
+ # premo invio prima di inserire il pin, in questo modo forzo il focus sull'input text
121
+ cmd=r"""adb -s "%s" shell "input keyevent KEYCODE_POWER && sleep 1 && input keyevent KEYCODE_ENTER && sleep 0.5"
122
+ adb -s "%s" shell "input text \"%d\" && sleep 0.5 && input keyevent KEYCODE_ENTER"
123
+ adb -s "%s" shell am start -a android.intent.action.SENDTO -d sms:"%s" --es sms_body "%s" --ez exit_on_sent true
124
+ adb -s "%s" shell "sleep 2 && input keyevent 61 && sleep 0.5 && input keyevent KEYCODE_ENTER && sleep 0.5 && am force-stop com.android.mms && input keyevent KEYCODE_POWER && echo \"FINE\""
125
+ """%(self.deviceId,
126
+ self.deviceId,unlockPin,
127
+ self.deviceId,numeroDest,msg,
128
+ self.deviceId)
129
+ output=ModuloStringhe.normalizzaEol(ModuloSystem.systemCallReturnOutput(cmd,None)).strip()
130
+ return output
@@ -0,0 +1,12 @@
1
+ from modulitiz_micro.ModuloDate import ModuloDate
2
+ from modulitiz_micro.android.enums.AndroidSmsTypeEnum import AndroidSmsTypeEnum
3
+
4
+
5
+ class SmsBean(object):
6
+ def __init__(self,arr:list[str]):
7
+ self.id=int(arr[0])
8
+ self.numCell=arr[2]
9
+ self.data=ModuloDate.timestampToDate(int(arr[4])*0.001)
10
+ self.dataInvio=ModuloDate.timestampToDate(int(arr[5])*0.001)
11
+ self.type=AndroidSmsTypeEnum(int(arr[9])).name.lower()
12
+ self.body=arr[12]