modulitiz-micro 2.41.0__py311-none-any.whl → 2.42.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 (107) hide show
  1. modulitiz_micro/ModuloMeteo.py +72 -72
  2. modulitiz_micro/ModuloSeriale.py +70 -70
  3. modulitiz_micro/ModuloTarghe.py +47 -46
  4. modulitiz_micro/database/AbstractDatabaseService.py +13 -13
  5. modulitiz_micro/database/AbstractSql.py +69 -69
  6. modulitiz_micro/database/ModuloSqlOracle.py +19 -19
  7. modulitiz_micro/database/ModuloSqlServer.py +43 -43
  8. modulitiz_micro/database/eccezioni/EccezioneDbNoData.py +6 -6
  9. modulitiz_micro/database/mysql/AbstractBasicMysql.py +114 -114
  10. modulitiz_micro/database/mysql/ModuloMysql.py +163 -163
  11. modulitiz_micro/database/mysql/MysqlCommonConverter.py +47 -47
  12. modulitiz_micro/database/mysql/eccezioni/EccezioneMysqlOffline.py +6 -6
  13. modulitiz_micro/database/sqlite/AbstractBasicSQLite.py +114 -114
  14. modulitiz_micro/database/sqlite/ModuloSQLite.py +82 -82
  15. modulitiz_micro/eccezioni/EccezioneCtrlC.py +7 -7
  16. modulitiz_micro/eccezioni/EccezioneScheduler.py +7 -7
  17. modulitiz_micro/eccezioni/http/EccezioneHttp.py +8 -8
  18. modulitiz_micro/eccezioni/http/EccezioneHttp404.py +7 -7
  19. modulitiz_micro/eccezioni/http/EccezioneHttpGeneric.py +7 -7
  20. modulitiz_micro/files/cache/DatabaseCache.py +91 -91
  21. modulitiz_micro/files/cache/decorators/cacheRam.py +26 -26
  22. modulitiz_micro/files/git/ModuloGit.py +28 -28
  23. modulitiz_micro/files/git/decorators/catchAndRaiseGitExceptions.py +19 -19
  24. modulitiz_micro/files/git/exceptions/EccezioneGit.py +7 -7
  25. modulitiz_micro/gestionedom/GestioneDom.py +44 -44
  26. modulitiz_micro/iot/ModuleIotDevice.py +4 -4
  27. modulitiz_micro/keylogger/EccezioneKeyLogger.py +7 -7
  28. modulitiz_micro/keylogger/ModuloKeylogger.py +73 -73
  29. modulitiz_micro/rete/ModuloNetworking.py +72 -72
  30. modulitiz_micro/rete/ModuloOpenVpn.py +15 -15
  31. modulitiz_micro/rete/email/EmailBean.py +5 -5
  32. modulitiz_micro/rete/email/ModuloEmail.py +90 -90
  33. modulitiz_micro/rete/http/ModuloHttp.py +119 -119
  34. modulitiz_micro/rete/http/ModuloHttpConnectionSafe.py +91 -91
  35. modulitiz_micro/rete/http/ModuloHttpUtils.py +69 -69
  36. modulitiz_micro/rete/http/beans/HttpResponseBean.py +5 -5
  37. modulitiz_micro/rete/http/decorators/catchAndRaiseHttpExceptions.py +22 -22
  38. modulitiz_micro/rete/ntp/AbstractModuloNtp.py +73 -73
  39. modulitiz_micro/rete/ntp/ModuloNtpIt.py +8 -8
  40. modulitiz_micro/rete/socketserver/AbstractBasicGetSocketServer.py +35 -35
  41. modulitiz_micro/rete/socketserver/AbstractSocketServer.py +267 -267
  42. modulitiz_micro/rete/ssl/ModuloSsl.py +56 -56
  43. modulitiz_micro/sistema/ModuloEnvVars.py +34 -34
  44. modulitiz_micro/sistema/ModuloSystemPipe.py +67 -67
  45. modulitiz_micro/social/telegram/AbstractModuloTelegram.py +53 -53
  46. modulitiz_micro/social/telegram/ModuloTelegramSimple.py +26 -26
  47. modulitiz_micro/util/beans/globalvar/AbstractBasicGlobalVarBean.py +15 -15
  48. modulitiz_micro/util/scheduler/ModuleScheduler.py +26 -26
  49. {modulitiz_micro-2.41.0.dist-info → modulitiz_micro-2.42.0.dist-info}/METADATA +58 -66
  50. modulitiz_micro-2.42.0.dist-info/RECORD +56 -0
  51. {modulitiz_micro-2.41.0.dist-info → modulitiz_micro-2.42.0.dist-info}/WHEEL +1 -1
  52. {modulitiz_micro-2.41.0.dist-info → modulitiz_micro-2.42.0.dist-info/licenses}/LICENSE +21 -21
  53. modulitiz_micro/ModuleEnum.py +0 -8
  54. modulitiz_micro/ModuloBase64.py +0 -61
  55. modulitiz_micro/ModuloColorText.py +0 -35
  56. modulitiz_micro/ModuloDate.py +0 -327
  57. modulitiz_micro/ModuloFunzioni.py +0 -71
  58. modulitiz_micro/ModuloListe.py +0 -150
  59. modulitiz_micro/ModuloNumeri.py +0 -127
  60. modulitiz_micro/ModuloPyinstaller.py +0 -29
  61. modulitiz_micro/ModuloStatistiche.py +0 -31
  62. modulitiz_micro/ModuloStringhe.py +0 -180
  63. modulitiz_micro/android/ModuloAndroid.py +0 -18
  64. modulitiz_micro/android/ModuloAndroidAdb.py +0 -48
  65. modulitiz_micro/android/ModuloAndroidSim.py +0 -130
  66. modulitiz_micro/android/beans/SmsBean.py +0 -12
  67. modulitiz_micro/android/enums/AndroidSmsTypeEnum.py +0 -17
  68. modulitiz_micro/eccezioni/EccezioneBase.py +0 -7
  69. modulitiz_micro/eccezioni/EccezioneRuntime.py +0 -7
  70. modulitiz_micro/eccezioni/EccezioneSoNonSupportato.py +0 -7
  71. modulitiz_micro/files/ModuloFiles.py +0 -173
  72. modulitiz_micro/files/ModuloLogging.py +0 -69
  73. modulitiz_micro/files/ModuloZip.py +0 -42
  74. modulitiz_micro/files/cache/CacheBean.py +0 -5
  75. modulitiz_micro/files/cache/CacheRam.py +0 -29
  76. modulitiz_micro/init/AbstractBasicInit.py +0 -27
  77. modulitiz_micro/init/AbstractInit.py +0 -11
  78. modulitiz_micro/multithread/ModuloThread.py +0 -26
  79. modulitiz_micro/multithread/ModuloThreadLogger.py +0 -8
  80. modulitiz_micro/multithread/ModuloThreadWithCallbackError.py +0 -25
  81. modulitiz_micro/nlp/ModuloNlp.py +0 -36
  82. modulitiz_micro/nlp/ModuloNlpDateAndTime.py +0 -59
  83. modulitiz_micro/sistema/EnvVarsEnum.py +0 -9
  84. modulitiz_micro/sistema/ModuloSystem.py +0 -298
  85. modulitiz_micro/util/beans/conf/AbstractBasicConfBean.py +0 -11
  86. modulitiz_micro/util/beans/conf/AbstractConfBean.py +0 -16
  87. modulitiz_micro/util/beans/fileconf/AbstractBasicFileConfBean.py +0 -11
  88. modulitiz_micro/util/beans/fileconf/AbstractFileConfBean.py +0 -13
  89. modulitiz_micro/util/beans/globalvar/AbstractGlobalVarBean.py +0 -34
  90. modulitiz_micro/util/decorators/noAwait.py +0 -23
  91. modulitiz_micro/util/pip/AbstractModuloPip.py +0 -41
  92. modulitiz_micro/util/pip/ModuloPip.py +0 -49
  93. modulitiz_micro/util/spooler/AbstractSpooler.py +0 -14
  94. modulitiz_micro/util/spooler/Spooler.py +0 -18
  95. modulitiz_micro/util/spooler/beans/QueueBean.py +0 -8
  96. modulitiz_micro/util/spooler/decorators/spooler.py +0 -49
  97. modulitiz_micro/util/spooler/eccezioni/EccezioneSpooler.py +0 -7
  98. modulitiz_micro/util/spooler/eccezioni/EccezioneSpoolerFull.py +0 -7
  99. modulitiz_micro/util/unittesting/AbstractOverrideTestUtil.py +0 -31
  100. modulitiz_micro/util/unittesting/AbstractTestUtil.py +0 -11
  101. modulitiz_micro/util/unittesting/ModuloRunUnitTest.py +0 -25
  102. modulitiz_micro/util/wheel/ModuloBuildWheel.py +0 -118
  103. modulitiz_micro/util/wheel/ModuloCheckTestNamingConvention.py +0 -89
  104. modulitiz_micro/util/wheel/ModuloToml.py +0 -40
  105. modulitiz_micro/util/wheel/ModuloWheel.py +0 -12
  106. modulitiz_micro-2.41.0.dist-info/RECORD +0 -109
  107. {modulitiz_micro-2.41.0.dist-info → modulitiz_micro-2.42.0.dist-info}/top_level.txt +0 -0
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2023-2040 tiz
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2023-2040 tiz
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,8 +0,0 @@
1
- class ModuleEnum(object):
2
- @staticmethod
3
- def isValueIn(value, enumClass)->bool:
4
- try:
5
- enumClass(value)
6
- except ValueError:
7
- return False
8
- return True
@@ -1,61 +0,0 @@
1
- import base64
2
-
3
- from modulitiz_micro.ModuloStringhe import ModuloStringhe
4
-
5
-
6
- class ModuloBase64(object):
7
- """
8
- Utility di gestione del sistema di codifica base64.
9
- """
10
-
11
- @staticmethod
12
- def codificaFile(inputFile:str,outputFile:str):
13
- """
14
- Legge un file binario e scrive un file con il relativo contenuto codificato.
15
- """
16
- # leggo
17
- with open(inputFile,"rb") as fp:
18
- contenuto=fp.read()
19
- # codifico
20
- encoded=base64.b64encode(contenuto)
21
- # scrivo
22
- with open(outputFile,"w+b") as fp:
23
- fp.write(encoded)
24
- @staticmethod
25
- def codificaStr(decodedStr:str)->str:
26
- """
27
- Converte una stringa.
28
- """
29
- return base64.b64encode(decodedStr.encode(ModuloStringhe.CODIFICA_UTF8)).decode(ModuloStringhe.CODIFICA_UTF8)
30
- @staticmethod
31
- def codificaStrUrlSafe(decodedStr:str)->str:
32
- """
33
- Converte una stringa in modo che possa essere usata come url.
34
- """
35
- return base64.urlsafe_b64encode(decodedStr.encode(ModuloStringhe.CODIFICA_UTF8)).decode(ModuloStringhe.CODIFICA_UTF8)
36
-
37
- @staticmethod
38
- def decodificaFile(inputFile:str,outputFile:str):
39
- """
40
- Legge il contenuto codificato di un file e lo decodifica, scrivendo l'output in un altro file.
41
- """
42
- # leggo
43
- with open(inputFile,"rb") as fp:
44
- contenuto=fp.read()
45
- # decodifico
46
- decoded=base64.b64decode(contenuto)
47
- # scrivo
48
- with open(outputFile,"w+b") as fp:
49
- fp.write(decoded)
50
- @staticmethod
51
- def decodificaStr(codedStr:str)->str:
52
- """
53
- Decodifica una stringa.
54
- """
55
- return base64.b64decode(codedStr.encode(ModuloStringhe.CODIFICA_UTF8)).decode(ModuloStringhe.CODIFICA_UTF8)
56
- @staticmethod
57
- def decodificaStrUrlSafe(codedStr:str)->str:
58
- """
59
- Decodifica una stringa che è stata codificata per essere usata come url.
60
- """
61
- return base64.urlsafe_b64decode(codedStr.encode(ModuloStringhe.CODIFICA_UTF8)).decode(ModuloStringhe.CODIFICA_UTF8)
@@ -1,35 +0,0 @@
1
- import colorama
2
- import webcolors
3
-
4
- from modulitiz_micro.rete.http.ModuloHttpUtils import ModuloHttpUtils
5
-
6
-
7
- class ModuloColorText(object):
8
- """
9
- Utility per gestire i colori e stampare a schermo testo colorato.
10
- """
11
-
12
- DEFAULT= '\033[0m'
13
- GRASSETTO= DEFAULT+'\033[1m'
14
- NERO= '\033[90m'
15
- ROSSO= '\033[91m'
16
- VERDE= '\033[92m'
17
- GIALLO= '\033[93m'
18
- BLU= '\033[94m'
19
- FUCSIA= '\033[95m'
20
- AZZURRO= '\033[96m'
21
-
22
- def __init__(self):
23
- colorama.init()
24
-
25
- @staticmethod
26
- def wordToRGB(word:str,lang:str="en")->str|None:
27
- """
28
- Traduce un colore in formato RGB, è possibile scegliere la lingua di origine.
29
- """
30
- if lang!="en":
31
- word=ModuloHttpUtils.translate(lang,"en",word)
32
- if word is None:
33
- return None
34
- word=word.replace(" ","").replace("ish","")
35
- return webcolors.name_to_hex(word)
@@ -1,327 +0,0 @@
1
- import time
2
- from datetime import UTC
3
- from datetime import date
4
- from datetime import datetime
5
- from datetime import time as dt_time
6
- from datetime import timedelta
7
- from datetime import timezone
8
- from datetime import tzinfo
9
-
10
- from suntime import Sun
11
-
12
-
13
- class ModuloDate(object):
14
- """
15
- Utility per gestire operazioni e formattazioni sulle date.
16
- """
17
-
18
- FORMATO_DATA="%Y-%m-%d"
19
- FORMATO_DATA_IT="%d/%m/%Y"
20
- FORMATO_DATA_ORA="%Y-%m-%d %H:%M:%S"
21
- FORMATO_DATA_ORA_NOMEFILE="%Y-%m-%d_%H-%M-%S"
22
- FORMATO_DATA_ORA_NOSPAZI="%Y%m%d%H%M%S"
23
- FORMATO_ORA="%H:%M:%S"
24
- FORMAT_HH_MM="%H:%M"
25
-
26
-
27
- @staticmethod
28
- def now()->datetime:
29
- """
30
- Data e ora attuali.
31
- """
32
- return datetime.now()
33
-
34
- @classmethod
35
- def nowUtc(cls)->datetime:
36
- """
37
- Data e ora attuali in formato UTC (quindi senza fuso orario e DST)
38
- """
39
- data=datetime.now(timezone.utc)
40
- data=cls.setTimezoneUtc(data)
41
- return data
42
-
43
- @staticmethod
44
- def today()->date:
45
- """
46
- Data odierna, senza ora.
47
- """
48
- return date.today()
49
-
50
- @staticmethod
51
- def getSecs()->int:
52
- """
53
- Timestamp in secondi in formato UTC
54
- """
55
- return int(time.time())
56
-
57
- @staticmethod
58
- def getMillis()->int:
59
- """
60
- Timestamp in millisecondi in formato UTC
61
- """
62
- return int(time.time()*1000)
63
-
64
- @classmethod
65
- def getWeekDay(cls,data:datetime|None=None)->str:
66
- """
67
- Se te lo restituisce in inglese devi settare il locale
68
- """
69
- if data is None:
70
- data=cls.now()
71
- return data.date().strftime("%A")
72
-
73
- #
74
- # conversioni
75
- #
76
- @classmethod
77
- def dateToString(cls,data:datetime|None=None,formato:str=FORMATO_DATA_ORA)->str:
78
- """
79
- Formatta un oggetto data.
80
- :param data: data da formattare, se non specificata viene usata la data attuale
81
- :param formato: in che modo deve essere formattata la data, se non specificato viene usato il formato inglese
82
- """
83
- if data is None:
84
- data=cls.now()
85
- return data.strftime(formato)
86
-
87
- @staticmethod
88
- def stringToDate(stringa:str,formato:str=FORMATO_DATA_ORA)->datetime:
89
- """
90
- Trasforma una data in formato stringa a oggetto.
91
- :param stringa: stringa da trasformare in data
92
- :param formato: in che modo deve essere formattata la data, se non specificato viene usato il formato inglese
93
- """
94
- return datetime.strptime(stringa,formato)
95
-
96
- @staticmethod
97
- def timeToString(orario:dt_time,formato:str=FORMATO_ORA)->str:
98
- """
99
- Formatta un oggetto di tipo ora.
100
- :param orario: orario da formattare
101
- :param formato: in che modo deve essere formattato l'orario, se non specificato viene usato il formato standard
102
- """
103
- return orario.strftime(formato)
104
- @classmethod
105
- def stringToTime(cls,stringa:str,formato:str=FORMATO_ORA)->dt_time:
106
- """
107
- Formatta un oggetto di tipo ora.
108
- :param stringa: stringa da formattare in orario
109
- :param formato: in che modo deve essere formattato l'orario, se non specificato viene usato il formato standard
110
- """
111
- return cls.dateToTime(cls.stringToDate(stringa,formato))
112
-
113
- @classmethod
114
- def timeToDate(cls,orario:dt_time)->datetime:
115
- """
116
- Converte da oggetto orario a data completa.
117
- Viene aggiunta la data odierna all'orario passato in input.
118
- """
119
- return datetime.combine(cls.today(), orario)
120
-
121
- @staticmethod
122
- def timedeltaToTime(orario:timedelta)->dt_time:
123
- """
124
- Converte un oggetto timedelta a oggetto orario.
125
- """
126
- return (datetime.min + orario).time()
127
-
128
- @staticmethod
129
- def dateToTime(data:datetime)->dt_time:
130
- """
131
- Rimuove la data da un oggetto data completo, lasciando solo l'orario.
132
- """
133
- return data.time()
134
-
135
- @staticmethod
136
- def dateToTimestamp(data:datetime)->int:
137
- """
138
- Converte un oggetto data completo in timestamp in secondi.
139
- Se ti serve avere il timestamp in formato UTC usa il metodo dedicato.
140
- """
141
- return int(datetime.timestamp(data))
142
- @staticmethod
143
- def timestampToDate(timestamp:int|float)->datetime:
144
- """
145
- Converte un timestamp in secondi in un oggetto data completo.
146
- Se ti serve lavorare con il timestamp in formato UTC usa il metodo dedicato.
147
- """
148
- return datetime.fromtimestamp(timestamp)
149
-
150
- @classmethod
151
- def dateToTimestampUtc(cls,data:datetime)->int:
152
- """
153
- Converte un oggetto data completo in timestamp in secondi in formato UTC.
154
- """
155
- return cls.dateToTimestamp(cls.setTimezoneUtc(data))
156
- @classmethod
157
- def timestampUtcToDate(cls,timestamp:int|float)->datetime:
158
- """
159
- Converte un timestamp in secondi in formato UTC in un oggetto data completo.
160
- Questo metodo richiede python >= 3.11
161
- """
162
- return datetime.fromtimestamp(timestamp,UTC)
163
-
164
- #
165
- # operazioni
166
- #
167
- @staticmethod
168
- def dateDiff(data1:datetime,data2:datetime)->timedelta:
169
- """
170
- Calcola la differenza di tempo (sia data che oraria) tra 2 date complete.
171
- """
172
- return data1-data2
173
-
174
- @classmethod
175
- def minutesDiff(cls,data1:datetime,data2:datetime)->int:
176
- """
177
- Calcola la differenza in minuti tra 2 date complete.
178
- """
179
- diff=cls.dateDiff(data1,data2)
180
- diffValue=0
181
- if diff.days is not None and diff.days!=0:
182
- diffValue+=diff.days*24*60
183
- diffValue+=int(diff.seconds/60)
184
- return diffValue
185
- @classmethod
186
- def hoursDiff(cls,data1:datetime,data2:datetime)->int:
187
- """
188
- Calcola la differenza in ore tra 2 date complete.
189
- """
190
- diff=cls.dateDiff(data1, data2)
191
- diffValue=0
192
- if diff.days is not None and diff.days!=0:
193
- diffValue+=diff.days*24
194
- diffValue+=int(diff.seconds/3600)
195
- return diffValue
196
- @classmethod
197
- def daysDiff(cls,data1:datetime,data2:datetime) -> int:
198
- """
199
- Calcola la differenza in giorni tra 2 date complete.
200
- """
201
- diff=cls.dateDiff(data1,data2)
202
- if diff.days is not None and diff.days!=0:
203
- return diff.days
204
- return 0
205
-
206
- @staticmethod
207
- def plusMinusDays(data:datetime,days:int|float)->datetime:
208
- """
209
- Aggiunge o toglie giorni ad una data completa.
210
- """
211
- td=timedelta(days=abs(days))
212
- if days>=0:
213
- return data + td
214
- return data - td
215
-
216
- @staticmethod
217
- def plusMinusHours(data:datetime,hours:int|float)->datetime:
218
- """
219
- Aggiunge o toglie ore ad una data completa.
220
- """
221
- td=timedelta(hours=abs(hours))
222
- if hours>=0:
223
- return data + td
224
- return data - td
225
-
226
- @staticmethod
227
- def plusMinusMinutes(data:datetime,minutes:int|float)->datetime:
228
- """
229
- Aggiunge o toglie minuti ad una data completa.
230
- """
231
- td=timedelta(minutes=abs(minutes))
232
- if minutes>=0:
233
- return data + td
234
- return data - td
235
-
236
- @staticmethod
237
- def plusMinusSeconds(data:datetime,seconds:int|float)->datetime:
238
- """
239
- Aggiunge o toglie minuti ad una data completa.
240
- """
241
- td=timedelta(seconds=abs(seconds))
242
- if seconds>=0:
243
- return data + td
244
- return data - td
245
-
246
- @staticmethod
247
- def setStartOfDay(data:datetime)->datetime:
248
- """
249
- Imposta l'inizio del giorno ad una data completa.
250
- """
251
- return data.replace(hour=0, minute=0, second=0, microsecond=0)
252
-
253
- @staticmethod
254
- def setEndOfDay(data:datetime)->datetime:
255
- """
256
- Imposta la fine del giorno ad una data completa.
257
- """
258
- return data.replace(hour=23, minute=59, second=59, microsecond=999999)
259
-
260
- @classmethod
261
- def setTimezoneLocale(cls,data:datetime)->datetime:
262
- """
263
- Imposta il fuso orario locale ad una data completa.
264
- """
265
- return cls.setTimezoneUtc(data).astimezone(tz=None)
266
-
267
- @classmethod
268
- def setTimezoneUtc(cls,data:datetime)->datetime:
269
- """
270
- Imposta SOLO il fuso orario UTC ad una data completa.
271
- """
272
- return cls.setTimezoneFromTzInfo(data,timezone.utc)
273
-
274
- @staticmethod
275
- def setTimezoneFromTzInfo(data:datetime,tz:tzinfo)->datetime:
276
- """
277
- Imposta un fuso orario ad una data completa.
278
- """
279
- return data.replace(tzinfo=tz)
280
-
281
- @classmethod
282
- def getTimezoneLocal(cls,dateTime:datetime|None=None)->tzinfo:
283
- """
284
- Ritorna il fuso orario locale + DST.
285
- """
286
- if dateTime is None:
287
- dateTime=cls.now()
288
- return dateTime.astimezone().tzinfo
289
-
290
- @staticmethod
291
- def isDst(dateTime:datetime)->bool:
292
- return time.localtime(ModuloDate.dateToTimestamp(dateTime)).tm_isdst==1
293
-
294
- @classmethod
295
- def getDstSeconds(cls,dateTime:datetime)->int:
296
- return 3600 if cls.isDst(dateTime) else 0
297
-
298
- #
299
- # sunrise / sunset
300
- #
301
-
302
- @classmethod
303
- def getLocalSunrise(cls,lat:float,long:float,dateTime:datetime|None=None)->datetime:
304
- if dateTime is None:
305
- dateTime=cls.now()
306
- sun=Sun(lat,long)
307
- return sun.get_sunrise_time(dateTime,cls.getTimezoneLocal(dateTime))
308
-
309
- @classmethod
310
- def getLocalSunset(cls,lat:float,long:float,dateTime:datetime|None=None)->datetime:
311
- if dateTime is None:
312
- dateTime=cls.now()
313
- sun=Sun(lat,long)
314
- return sun.get_sunset_time(dateTime,cls.getTimezoneLocal(dateTime))
315
-
316
- #
317
- # others
318
- #
319
- @classmethod
320
- def calculateElapsedSecs(cls,millisInizio:int)->str:
321
- """
322
- Crea la frase che mostra quanti secondi sono trascorsi dall'inizio.
323
- """
324
- elapsedSecs=int((cls.getMillis()-millisInizio)*0.001)
325
- if elapsedSecs==0:
326
- return ""
327
- return f" in {elapsedSecs}s"
@@ -1,71 +0,0 @@
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
- Also counts inner classes.
42
- """
43
- module=ast.parse(ModuloFiles.readFileText(filename,True))
44
- classes=[node.name for node in ast.walk(module) if isinstance(node,ast.ClassDef)]
45
- return classes
46
-
47
- @staticmethod
48
- def orderDict(diz:dict)->dict:
49
- """
50
- Ordina gli elementi di un dizionario.
51
- Nota: ha senso solo se hai intenzione di esporlo all'utente sotto forma di lista.
52
- """
53
- myKeys = list(diz.keys())
54
- myKeys.sort()
55
- newDiz = {i: diz[i] for i in myKeys}
56
- return newDiz
57
-
58
- @staticmethod
59
- def dictGetFirstValue(diz: dict):
60
- """
61
- Ritorna il valore del primo elemnto di un dizionario.
62
- È ottimizzato per oggetti con molti elementi.
63
- """
64
- return next(iter(diz.items()))[1]
65
-
66
- @staticmethod
67
- def randomBoolean()->bool:
68
- """
69
- Genera un valore booleano in modo randomico.
70
- """
71
- return bool(random.getrandbits(1))
@@ -1,150 +0,0 @@
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