rpa-suite 1.5.8__py3-none-any.whl → 1.5.9__py3-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.
- rpa_suite/__init__.py +1 -1
- rpa_suite/core/__init__.py +2 -5
- rpa_suite/core/asyncrun.py +1 -1
- rpa_suite/core/browser.py +18 -33
- rpa_suite/core/clock.py +12 -26
- rpa_suite/core/date.py +4 -4
- rpa_suite/core/dir.py +17 -21
- rpa_suite/core/email.py +9 -18
- rpa_suite/core/file.py +16 -23
- rpa_suite/core/log.py +16 -20
- rpa_suite/core/parallel.py +8 -22
- rpa_suite/core/print.py +4 -10
- rpa_suite/core/regex.py +3 -3
- rpa_suite/core/validate.py +8 -18
- rpa_suite/functions/__create_ss_dir.py +2 -6
- rpa_suite/functions/__init__.py +1 -1
- rpa_suite/suite.py +6 -14
- rpa_suite/utils/__init__.py +1 -1
- rpa_suite/utils/system.py +16 -17
- {rpa_suite-1.5.8.dist-info → rpa_suite-1.5.9.dist-info}/METADATA +12 -10
- rpa_suite-1.5.9.dist-info/RECORD +25 -0
- rpa_suite-1.5.8.dist-info/RECORD +0 -25
- {rpa_suite-1.5.8.dist-info → rpa_suite-1.5.9.dist-info}/WHEEL +0 -0
- {rpa_suite-1.5.8.dist-info → rpa_suite-1.5.9.dist-info}/licenses/LICENSE +0 -0
- {rpa_suite-1.5.8.dist-info → rpa_suite-1.5.9.dist-info}/top_level.txt +0 -0
rpa_suite/__init__.py
CHANGED
@@ -60,7 +60,7 @@ Módulos disponíveis:
|
|
60
60
|
``Browser``: Objeto de Automação de Navegadores (necessario Selenium e Webdriver_Manager)
|
61
61
|
"""
|
62
62
|
|
63
|
-
__version__ =
|
63
|
+
__version__ = "1.5.5"
|
64
64
|
|
65
65
|
# allows importing the rpa_suite module without the package name
|
66
66
|
from .suite import rpa
|
rpa_suite/core/__init__.py
CHANGED
@@ -41,11 +41,8 @@ from .asyncrun import AsyncRunner
|
|
41
41
|
import importlib.util
|
42
42
|
|
43
43
|
# from .browser import Browser
|
44
|
-
if importlib.util.find_spec("selenium") and importlib.util.find_spec(
|
45
|
-
"webdriver_manager"
|
46
|
-
):
|
44
|
+
if importlib.util.find_spec("selenium") and importlib.util.find_spec("webdriver_manager"):
|
47
45
|
from .browser import Browser
|
48
46
|
|
49
47
|
|
50
|
-
__version__ =
|
51
|
-
|
48
|
+
__version__ = "1.5.5"
|
rpa_suite/core/asyncrun.py
CHANGED
rpa_suite/core/browser.py
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
# rpa_suite/core/browser.py
|
2
2
|
|
3
|
-
# imports
|
4
|
-
from
|
3
|
+
# imports standard
|
4
|
+
from time import sleep
|
5
|
+
import os
|
6
|
+
import requests
|
5
7
|
|
6
|
-
# imports
|
8
|
+
# imports third party
|
7
9
|
from selenium import webdriver
|
8
10
|
from selenium.webdriver.common.by import By
|
9
11
|
from selenium.webdriver.chrome.options import Options
|
@@ -11,9 +13,8 @@ from selenium.webdriver.support.ui import WebDriverWait
|
|
11
13
|
from selenium.webdriver.support import expected_conditions as EC
|
12
14
|
from webdriver_manager.chrome import ChromeDriverManager
|
13
15
|
|
14
|
-
# imports
|
15
|
-
from
|
16
|
-
import os, requests
|
16
|
+
# imports internal
|
17
|
+
from rpa_suite.functions._printer import error_print, alert_print, success_print
|
17
18
|
|
18
19
|
|
19
20
|
class Browser:
|
@@ -107,9 +108,7 @@ class Browser:
|
|
107
108
|
# Use the absolute path from comment
|
108
109
|
|
109
110
|
options = Options()
|
110
|
-
options.add_experimental_option(
|
111
|
-
"debuggerAddress", f"127.0.0.1:{str(self.port)}"
|
112
|
-
)
|
111
|
+
options.add_experimental_option("debuggerAddress", f"127.0.0.1:{str(self.port)}")
|
113
112
|
|
114
113
|
# Additional configs
|
115
114
|
options.add_argument("--start-maximized")
|
@@ -117,9 +116,7 @@ class Browser:
|
|
117
116
|
|
118
117
|
# Verifica se o caminho do driver está correto
|
119
118
|
if not os.path.exists(self.path_driver):
|
120
|
-
raise FileNotFoundError(
|
121
|
-
f"O caminho do driver não foi encontrado: {self.path_driver}"
|
122
|
-
)
|
119
|
+
raise FileNotFoundError(f"O caminho do driver não foi encontrado: {self.path_driver}")
|
123
120
|
|
124
121
|
# Create driver with options and chromedriver path
|
125
122
|
self.driver = webdriver.Chrome(
|
@@ -129,13 +126,9 @@ class Browser:
|
|
129
126
|
)
|
130
127
|
|
131
128
|
except Exception as e:
|
132
|
-
error_print(
|
133
|
-
f"Erro durante a função: {self.configure_browser.__name__}! Error: {str(e)}."
|
134
|
-
)
|
129
|
+
error_print(f"Erro durante a função: {self.configure_browser.__name__}! Error: {str(e)}.")
|
135
130
|
|
136
|
-
def start_browser(
|
137
|
-
self, close_chrome_on_this_port: bool = True, display_message: bool = False
|
138
|
-
):
|
131
|
+
def start_browser(self, close_chrome_on_this_port: bool = True, display_message: bool = False):
|
139
132
|
"""
|
140
133
|
Starts a Chrome browser instance with remote debugging enabled.
|
141
134
|
Args:
|
@@ -200,17 +193,13 @@ class Browser:
|
|
200
193
|
|
201
194
|
try:
|
202
195
|
sleep(0.9)
|
203
|
-
element = WebDriverWait(self.driver, timeout).until(
|
204
|
-
EC.presence_of_element_located((by, value))
|
205
|
-
)
|
196
|
+
element = WebDriverWait(self.driver, timeout).until(EC.presence_of_element_located((by, value)))
|
206
197
|
return element
|
207
198
|
|
208
199
|
except Exception as e:
|
209
200
|
|
210
201
|
if display_message:
|
211
|
-
error_print(
|
212
|
-
f"Erro durante a função: {self.find_ele.__name__}! Error: {str(e)}."
|
213
|
-
)
|
202
|
+
error_print(f"Erro durante a função: {self.find_ele.__name__}! Error: {str(e)}.")
|
214
203
|
return None
|
215
204
|
else:
|
216
205
|
return None
|
@@ -303,29 +292,25 @@ class Browser:
|
|
303
292
|
f'taskkill /f /im chrome.exe /fi "commandline like *--remote-debugging-port={str(self.port)}*" /t >nul 2>&1'
|
304
293
|
)
|
305
294
|
if display_message:
|
306
|
-
alert_print(
|
295
|
+
alert_print("Browser: Fechado via força!")
|
307
296
|
|
308
297
|
else:
|
309
298
|
if display_message:
|
310
|
-
success_print(
|
299
|
+
success_print("Browser: Fechado com sucesso!")
|
311
300
|
|
312
301
|
except Exception as e:
|
313
302
|
|
314
303
|
try:
|
315
304
|
if display_message:
|
316
|
-
alert_print(
|
317
|
-
f"Erro ao fechar navegador: {str(e)}, Tentando meio mais forte!"
|
318
|
-
)
|
305
|
+
alert_print(f"Erro ao fechar navegador: {str(e)}, Tentando meio mais forte!")
|
319
306
|
|
320
307
|
# Último recurso - mata todos os processos do Chrome (use com cautela)
|
321
308
|
os.system(
|
322
309
|
f'taskkill /f /im chrome.exe /fi "commandline like *--remote-debugging-port={str(self.port)}*" /t >nul 2>&1'
|
323
310
|
)
|
324
311
|
if display_message:
|
325
|
-
alert_print(
|
312
|
+
alert_print("Browser: Fechado via força extrema!")
|
326
313
|
|
327
314
|
except Exception as error_ultimate:
|
328
315
|
if display_message:
|
329
|
-
error_print(
|
330
|
-
f"Falha crítica ao tentar fechar o navegador! Error: {str(error_ultimate)}!"
|
331
|
-
)
|
316
|
+
error_print(f"Falha crítica ao tentar fechar o navegador! Error: {str(error_ultimate)}!")
|
rpa_suite/core/clock.py
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# rpa_suite/core/clock.py
|
2
2
|
|
3
|
-
# imports
|
4
|
-
from rpa_suite.functions._printer import error_print, success_print
|
5
|
-
|
6
|
-
# imports third-party
|
3
|
+
# imports standard
|
7
4
|
import time
|
8
5
|
from typing import Callable, Any
|
9
6
|
from datetime import datetime as dt
|
10
7
|
|
8
|
+
# imports internal
|
9
|
+
from rpa_suite.functions._printer import error_print, success_print
|
10
|
+
|
11
11
|
|
12
12
|
class Clock:
|
13
13
|
"""
|
@@ -111,7 +111,7 @@ class Clock:
|
|
111
111
|
minutes = str(now.minute) if now.minute >= 10 else f"0{now.minute}"
|
112
112
|
moment_now = f"{hours}:{minutes}"
|
113
113
|
|
114
|
-
if hour_to_exec
|
114
|
+
if hour_to_exec is None:
|
115
115
|
|
116
116
|
# Process
|
117
117
|
while run:
|
@@ -140,9 +140,7 @@ class Clock:
|
|
140
140
|
run = False
|
141
141
|
result["tried"] = not run
|
142
142
|
result["success"] = True
|
143
|
-
success_print(
|
144
|
-
f"{fn_to_exec.__name__}: Successfully executed!"
|
145
|
-
)
|
143
|
+
success_print(f"{fn_to_exec.__name__}: Successfully executed!")
|
146
144
|
break
|
147
145
|
|
148
146
|
except Exception as e:
|
@@ -157,9 +155,7 @@ class Clock:
|
|
157
155
|
time.sleep(30)
|
158
156
|
now = dt.now()
|
159
157
|
hours = str(now.hour) if now.hour >= 10 else f"0{now.hour}"
|
160
|
-
minutes = (
|
161
|
-
str(now.minute) if now.minute >= 10 else f"0{now.minute}"
|
162
|
-
)
|
158
|
+
minutes = str(now.minute) if now.minute >= 10 else f"0{now.minute}"
|
163
159
|
moment_now = f"{hours}:{minutes}"
|
164
160
|
|
165
161
|
return result
|
@@ -167,14 +163,10 @@ class Clock:
|
|
167
163
|
except Exception as e:
|
168
164
|
|
169
165
|
result["success"] = False
|
170
|
-
error_print(
|
171
|
-
f"An error occurred on function from executing: {self.exec_at_hour.__name__}. Error: {str(e)}"
|
172
|
-
)
|
166
|
+
error_print(f"An error occurred on function from executing: {self.exec_at_hour.__name__}. Error: {str(e)}")
|
173
167
|
return result
|
174
168
|
|
175
|
-
def wait_for_exec(
|
176
|
-
self, wait_time: int, fn_to_exec: Callable[..., Any], *args, **kwargs
|
177
|
-
) -> dict[str, bool]:
|
169
|
+
def wait_for_exec(self, wait_time: int, fn_to_exec: Callable[..., Any], *args, **kwargs) -> dict[str, bool]:
|
178
170
|
"""
|
179
171
|
Timer function, wait for a value in ``seconds`` to execute the function of the argument.
|
180
172
|
|
@@ -226,9 +218,7 @@ class Clock:
|
|
226
218
|
time.sleep(wait_time)
|
227
219
|
fn_to_exec(*args, **kwargs)
|
228
220
|
result["success"] = True
|
229
|
-
success_print(
|
230
|
-
f"Function: {self.wait_for_exec.__name__} executed the function: {fn_to_exec.__name__}."
|
231
|
-
)
|
221
|
+
success_print(f"Function: {self.wait_for_exec.__name__} executed the function: {fn_to_exec.__name__}.")
|
232
222
|
|
233
223
|
except Exception as e:
|
234
224
|
result["success"] = False
|
@@ -238,9 +228,7 @@ class Clock:
|
|
238
228
|
|
239
229
|
return result
|
240
230
|
|
241
|
-
def exec_and_wait(
|
242
|
-
self, wait_time: int, fn_to_exec: Callable[..., Any], *args, **kwargs
|
243
|
-
) -> dict[str, bool]:
|
231
|
+
def exec_and_wait(self, wait_time: int, fn_to_exec: Callable[..., Any], *args, **kwargs) -> dict[str, bool]:
|
244
232
|
"""
|
245
233
|
Timer function, executes a function and waits for the time in ``seconds``
|
246
234
|
|
@@ -292,9 +280,7 @@ class Clock:
|
|
292
280
|
fn_to_exec(*args, **kwargs)
|
293
281
|
time.sleep(wait_time)
|
294
282
|
result["success"] = True
|
295
|
-
success_print(
|
296
|
-
f"Function: {self.wait_for_exec.__name__} executed the function: {fn_to_exec.__name__}."
|
297
|
-
)
|
283
|
+
success_print(f"Function: {self.wait_for_exec.__name__} executed the function: {fn_to_exec.__name__}.")
|
298
284
|
|
299
285
|
except Exception as e:
|
300
286
|
result["success"] = False
|
rpa_suite/core/date.py
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# rpa_suite/core/date.py
|
2
2
|
|
3
|
-
# imports
|
4
|
-
from rpa_suite.functions._printer import error_print
|
5
|
-
|
6
|
-
# imports third-party
|
3
|
+
# imports standard
|
7
4
|
import datetime as dt
|
8
5
|
from typing import Optional as Op
|
9
6
|
from typing import Tuple
|
10
7
|
|
8
|
+
# imports internal
|
9
|
+
from rpa_suite.functions._printer import error_print
|
10
|
+
|
11
11
|
|
12
12
|
class Date:
|
13
13
|
"""
|
rpa_suite/core/dir.py
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
# rpa_suite/core/dir.py
|
2
2
|
|
3
|
+
# imports standard
|
4
|
+
import os
|
5
|
+
import shutil
|
6
|
+
from typing import Union
|
7
|
+
|
3
8
|
# imports internal
|
4
9
|
from rpa_suite.functions._printer import error_print, alert_print, success_print
|
5
10
|
|
6
|
-
# imports third-party
|
7
|
-
import os, shutil
|
8
|
-
from typing import Union
|
9
|
-
|
10
11
|
|
11
12
|
class Directory:
|
12
13
|
"""
|
@@ -51,7 +52,12 @@ class Directory:
|
|
51
52
|
name_temp_dir (str): O nome do diretório temporário a ser criado. O padrão é 'temp'.
|
52
53
|
"""
|
53
54
|
|
54
|
-
def __init__(self):
|
55
|
+
def __init__(self):
|
56
|
+
"""
|
57
|
+
Função construtora da Classe que fornece utilitários para gerenciamento de:\n
|
58
|
+
diretórios, incluindo criação, exclusão e manipulação de diretórios.
|
59
|
+
"""
|
60
|
+
...
|
55
61
|
|
56
62
|
def create_temp_dir(
|
57
63
|
self,
|
@@ -130,19 +136,14 @@ class Directory:
|
|
130
136
|
except PermissionError:
|
131
137
|
result["success"] = False
|
132
138
|
result["path_created"] = None
|
133
|
-
alert_print(
|
134
|
-
f"Permission denied: Not possible to create Directory '{full_path}'."
|
135
|
-
)
|
139
|
+
alert_print(f"Permission denied: Not possible to create Directory '{full_path}'.")
|
136
140
|
|
137
141
|
except Exception as e:
|
138
142
|
result["success"] = False
|
139
143
|
result["path_created"] = None
|
140
|
-
error_print(
|
141
|
-
f"Error capturing current path to create temporary directory! Error: {str(e)}"
|
142
|
-
)
|
144
|
+
error_print(f"Error capturing current path to create temporary directory! Error: {str(e)}")
|
143
145
|
|
144
|
-
|
145
|
-
return result
|
146
|
+
return result
|
146
147
|
|
147
148
|
def delete_temp_dir(
|
148
149
|
self,
|
@@ -230,16 +231,11 @@ class Directory:
|
|
230
231
|
except PermissionError:
|
231
232
|
result["success"] = False
|
232
233
|
result["path_deleted"] = None
|
233
|
-
alert_print(
|
234
|
-
f"Permission denied: Not possible to delete Directory '{full_path}'."
|
235
|
-
)
|
234
|
+
alert_print(f"Permission denied: Not possible to delete Directory '{full_path}'.")
|
236
235
|
|
237
236
|
except Exception as e:
|
238
237
|
result["success"] = False
|
239
238
|
result["path_deleted"] = None
|
240
|
-
error_print(
|
241
|
-
f"Error capturing current path to delete temporary directory! Error: {str(e)}"
|
242
|
-
)
|
239
|
+
error_print(f"Error capturing current path to delete temporary directory! Error: {str(e)}.")
|
243
240
|
|
244
|
-
|
245
|
-
return result
|
241
|
+
return result
|
rpa_suite/core/email.py
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
# rpa_suite/core/email.py
|
2
2
|
|
3
|
-
# imports
|
4
|
-
|
5
|
-
|
6
|
-
# imports third-party
|
3
|
+
# imports standard
|
4
|
+
import os
|
7
5
|
import smtplib
|
8
|
-
from email.mime.image import MIMEImage
|
9
6
|
from email.mime.multipart import MIMEMultipart
|
10
7
|
from email.mime.text import MIMEText
|
11
8
|
from email.mime.base import MIMEBase
|
12
9
|
from email import encoders
|
13
10
|
|
11
|
+
# imports internal
|
12
|
+
from rpa_suite.functions._printer import alert_print, error_print, success_print
|
13
|
+
|
14
14
|
|
15
15
|
class Email:
|
16
16
|
"""
|
@@ -117,7 +117,8 @@ class Email:
|
|
117
117
|
Default: '<p>test message</p>'.
|
118
118
|
|
119
119
|
Returns:
|
120
|
-
None: This function does not explicitly return any value
|
120
|
+
None: This function does not explicitly return any value,\n
|
121
|
+
but prints success or failure messages when sending the email.
|
121
122
|
|
122
123
|
pt-br
|
123
124
|
------
|
@@ -160,11 +161,7 @@ class Email:
|
|
160
161
|
# Criando a mensagem
|
161
162
|
msg = MIMEMultipart()
|
162
163
|
msg["From"] = self.email_user
|
163
|
-
msg["To"] = (
|
164
|
-
", ".join(self.email_to)
|
165
|
-
if isinstance(self.email_to, list)
|
166
|
-
else self.email_to
|
167
|
-
)
|
164
|
+
msg["To"] = ", ".join(self.email_to) if isinstance(self.email_to, list) else self.email_to
|
168
165
|
msg["Subject"] = str(self.subject_title)
|
169
166
|
|
170
167
|
# Corpo do e-mail
|
@@ -173,10 +170,6 @@ class Email:
|
|
173
170
|
|
174
171
|
# Anexos (opcional)
|
175
172
|
if self.attachments:
|
176
|
-
from email.mime.base import MIMEBase
|
177
|
-
from email import encoders
|
178
|
-
import os
|
179
|
-
|
180
173
|
for attachment_path in self.attachments:
|
181
174
|
try:
|
182
175
|
with open(attachment_path, "rb") as attachment:
|
@@ -190,9 +183,7 @@ class Email:
|
|
190
183
|
msg.attach(part)
|
191
184
|
|
192
185
|
except Exception as e:
|
193
|
-
error_print(
|
194
|
-
f"Erro ao anexar o arquivo {attachment_path}: {str(e)}"
|
195
|
-
)
|
186
|
+
error_print(f"Erro ao anexar o arquivo {attachment_path}: {str(e)}")
|
196
187
|
|
197
188
|
try:
|
198
189
|
if self.auth_tls:
|
rpa_suite/core/file.py
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
# rpa_suite/core/file.py
|
2
2
|
|
3
|
-
# imports
|
4
|
-
from rpa_suite.functions._printer import error_print, success_print, alert_print
|
5
|
-
from rpa_suite.functions.__create_ss_dir import __create_ss_dir as create_ss_dir
|
6
|
-
|
7
|
-
# imports external
|
8
|
-
from colorama import Fore
|
9
|
-
|
10
|
-
# imports third-party
|
3
|
+
# imports standard
|
11
4
|
import os, time
|
12
5
|
from datetime import datetime
|
13
6
|
from typing import Dict, List, Union
|
14
7
|
|
8
|
+
# imports third party
|
9
|
+
from colorama import Fore
|
10
|
+
|
11
|
+
# imports internal
|
12
|
+
from rpa_suite.functions._printer import error_print, success_print, alert_print
|
13
|
+
from rpa_suite.functions.__create_ss_dir import __create_ss_dir as create_ss_dir
|
14
|
+
|
15
15
|
|
16
16
|
class File:
|
17
17
|
"""
|
@@ -138,9 +138,7 @@ class File:
|
|
138
138
|
|
139
139
|
if save_with_date: # use date on file name
|
140
140
|
image = pyautogui.screenshot()
|
141
|
-
file_name = (
|
142
|
-
f'{file_name}_{datetime.today().strftime("%d_%m_%Y-%H_%M_%S")}.png'
|
143
|
-
)
|
141
|
+
file_name = f'{file_name}_{datetime.today().strftime("%d_%m_%Y-%H_%M_%S")}.png'
|
144
142
|
path_file_screenshoted = os.path.join(path_dir, file_name)
|
145
143
|
|
146
144
|
image.save(path_file_screenshoted)
|
@@ -164,9 +162,7 @@ class File:
|
|
164
162
|
|
165
163
|
except Exception as e:
|
166
164
|
|
167
|
-
error_print(
|
168
|
-
f"Error to execute function:{self.screen_shot.__name__}! Error: {str(e)}"
|
169
|
-
)
|
165
|
+
error_print(f"Error to execute function:{self.screen_shot.__name__}! Error: {str(e)}")
|
170
166
|
return None
|
171
167
|
|
172
168
|
def flag_create(
|
@@ -180,7 +176,7 @@ class File:
|
|
180
176
|
"""
|
181
177
|
|
182
178
|
try:
|
183
|
-
if path_to_create
|
179
|
+
if path_to_create is None:
|
184
180
|
path_origin: str = os.getcwd()
|
185
181
|
full_path_with_name = rf"{path_origin}/{name_file}"
|
186
182
|
else:
|
@@ -206,7 +202,7 @@ class File:
|
|
206
202
|
|
207
203
|
try:
|
208
204
|
|
209
|
-
if path_to_delete
|
205
|
+
if path_to_delete is None:
|
210
206
|
path_origin: str = os.getcwd()
|
211
207
|
full_path_with_name = rf"{path_origin}/{name_file}"
|
212
208
|
else:
|
@@ -264,21 +260,18 @@ class File:
|
|
264
260
|
|
265
261
|
# Process
|
266
262
|
try:
|
267
|
-
for
|
268
|
-
for _, _, files in os.walk(
|
263
|
+
for directory in dir_to_count:
|
264
|
+
for _, _, files in os.walk(directory):
|
269
265
|
for file in files:
|
270
266
|
if type_extension == "*" or file.endswith(f".{type_extension}"):
|
271
267
|
result["qt"] += 1
|
272
268
|
result["success"] = True
|
273
269
|
|
274
270
|
if display_message:
|
275
|
-
success_print(
|
276
|
-
f'Function: {self.count_files.__name__} counted {result["qt"]} files.'
|
277
|
-
)
|
271
|
+
success_print(f'Function: {self.count_files.__name__} counted {result["qt"]} files.')
|
278
272
|
|
279
273
|
except Exception as e:
|
280
274
|
result["success"] = False
|
281
275
|
error_print(f"Error when trying to count files! Error: {str(e)}")
|
282
276
|
|
283
|
-
|
284
|
-
return result
|
277
|
+
return result
|
rpa_suite/core/log.py
CHANGED
@@ -3,12 +3,14 @@
|
|
3
3
|
# imports internal
|
4
4
|
from rpa_suite.functions._printer import error_print, alert_print, success_print
|
5
5
|
|
6
|
-
# imports
|
6
|
+
# imports third party
|
7
7
|
from loguru import logger
|
8
8
|
|
9
|
-
# imports
|
9
|
+
# imports standard
|
10
10
|
from typing import Optional as Op
|
11
|
-
import sys
|
11
|
+
import sys
|
12
|
+
import os
|
13
|
+
import inspect
|
12
14
|
|
13
15
|
|
14
16
|
class Filters:
|
@@ -83,13 +85,13 @@ class Log:
|
|
83
85
|
|
84
86
|
try:
|
85
87
|
os.makedirs(self.full_path, exist_ok=True)
|
86
|
-
if display_message:
|
88
|
+
if display_message:
|
89
|
+
success_print(f"Diretório:'{self.full_path}' foi criado com sucesso.")
|
87
90
|
except FileExistsError:
|
88
|
-
if display_message:
|
91
|
+
if display_message:
|
92
|
+
alert_print(f"Diretório:'{self.full_path}' já existe.")
|
89
93
|
except PermissionError:
|
90
|
-
alert_print(
|
91
|
-
f"Permissão negada: não é possível criar o diretório '{self.full_path}'."
|
92
|
-
)
|
94
|
+
alert_print(f"Permissão negada: não é possível criar o diretório '{self.full_path}'.")
|
93
95
|
|
94
96
|
new_filter = None
|
95
97
|
if filter_words is not None:
|
@@ -104,9 +106,7 @@ class Log:
|
|
104
106
|
formatter = CustomFormatter()
|
105
107
|
|
106
108
|
if new_filter:
|
107
|
-
self.logger.add(
|
108
|
-
file_handler, filter=new_filter, level="DEBUG", format=log_format
|
109
|
-
)
|
109
|
+
self.logger.add(file_handler, filter=new_filter, level="DEBUG", format=log_format)
|
110
110
|
else:
|
111
111
|
self.logger.add(file_handler, level="DEBUG", format=log_format)
|
112
112
|
|
@@ -115,9 +115,7 @@ class Log:
|
|
115
115
|
return file_handler
|
116
116
|
|
117
117
|
except Exception as e:
|
118
|
-
error_print(
|
119
|
-
f"Houve um erro durante a execução da função: {self.config_logger.__name__}! Error: {str(e)}."
|
120
|
-
)
|
118
|
+
error_print(f"Houve um erro durante a execução da função: {self.config_logger.__name__}! Error: {str(e)}.")
|
121
119
|
return None
|
122
120
|
|
123
121
|
def _log(self, level: str, msg: str):
|
@@ -128,16 +126,16 @@ class Log:
|
|
128
126
|
# Find the first frame that's not from this log.py file
|
129
127
|
frame = inspect.currentframe()
|
130
128
|
current_file = os.path.normpath(__file__)
|
131
|
-
|
129
|
+
|
132
130
|
while frame:
|
133
131
|
frame = frame.f_back
|
134
132
|
if frame and os.path.normpath(frame.f_code.co_filename) != current_file:
|
135
133
|
break
|
136
|
-
|
134
|
+
|
137
135
|
if not frame:
|
138
136
|
# Fallback if we can't find external caller
|
139
137
|
frame = inspect.currentframe().f_back.f_back
|
140
|
-
|
138
|
+
|
141
139
|
full_path_filename = frame.f_code.co_filename
|
142
140
|
|
143
141
|
# Normalize path to use os.sep
|
@@ -157,9 +155,7 @@ class Log:
|
|
157
155
|
def log_start_run_debug(self, msg_start_loggin: str) -> None:
|
158
156
|
try:
|
159
157
|
with open(self.file_handler, "a") as log_file:
|
160
|
-
log_file.write(
|
161
|
-
"\n"
|
162
|
-
) # Add a blank line before logging the start message
|
158
|
+
log_file.write("\n") # Add a blank line before logging the start message
|
163
159
|
self._log("DEBUG", msg_start_loggin)
|
164
160
|
except Exception as e:
|
165
161
|
error_print(
|
rpa_suite/core/parallel.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# rpa_suite/core/parallel.py
|
2
2
|
|
3
|
-
# imports
|
3
|
+
# imports standard
|
4
4
|
from multiprocessing import Process, Manager
|
5
5
|
from typing import Any, Callable, Dict, Optional, TypeVar, Generic
|
6
6
|
import time
|
@@ -177,9 +177,7 @@ class ParallelRunner(Generic[T]):
|
|
177
177
|
return False
|
178
178
|
return self._process.is_alive()
|
179
179
|
|
180
|
-
def get_result(
|
181
|
-
self, timeout: Optional[float] = 60, terminate_on_timeout: bool = True
|
182
|
-
) -> Dict[str, Any]:
|
180
|
+
def get_result(self, timeout: Optional[float] = 60, terminate_on_timeout: bool = True) -> Dict[str, Any]:
|
183
181
|
"""
|
184
182
|
Retrieves the result of the parallel execution.
|
185
183
|
|
@@ -234,27 +232,19 @@ class ParallelRunner(Generic[T]):
|
|
234
232
|
|
235
233
|
# Debug - mostra o dicionário compartilhado
|
236
234
|
if self.display_message:
|
237
|
-
print(
|
238
|
-
f"[Processo Principal] Dicionário compartilhado: {dict(self._result_dict)}"
|
239
|
-
)
|
235
|
+
print(f"[Processo Principal] Dicionário compartilhado: {dict(self._result_dict)}")
|
240
236
|
|
241
237
|
# Verifica se o processo terminou ou se atingiu o timeout
|
242
238
|
if self._process.is_alive():
|
243
239
|
if terminate_on_timeout:
|
244
240
|
self._process.terminate()
|
245
|
-
self._process.join(
|
246
|
-
timeout=1
|
247
|
-
) # Pequeno timeout para garantir que o processo termine
|
241
|
+
self._process.join(timeout=1) # Pequeno timeout para garantir que o processo termine
|
248
242
|
result["terminated"] = True
|
249
243
|
result["success"] = False
|
250
|
-
result["error"] =
|
251
|
-
f"Operação cancelada por timeout após {execution_time:.2f} segundos"
|
252
|
-
)
|
244
|
+
result["error"] = f"Operação cancelada por timeout após {execution_time:.2f} segundos"
|
253
245
|
else:
|
254
246
|
result["success"] = False
|
255
|
-
result["error"] =
|
256
|
-
f"Operação ainda em execução após {execution_time:.2f} segundos"
|
257
|
-
)
|
247
|
+
result["error"] = f"Operação ainda em execução após {execution_time:.2f} segundos"
|
258
248
|
else:
|
259
249
|
# Processo terminou normalmente - verificamos o status
|
260
250
|
status = self._result_dict.get("status", "unknown")
|
@@ -266,9 +256,7 @@ class ParallelRunner(Generic[T]):
|
|
266
256
|
result["result"] = self._result_dict["result"]
|
267
257
|
else:
|
268
258
|
result["success"] = False
|
269
|
-
result["error"] =
|
270
|
-
"Resultado não encontrado no dicionário compartilhado"
|
271
|
-
)
|
259
|
+
result["error"] = "Resultado não encontrado no dicionário compartilhado"
|
272
260
|
else:
|
273
261
|
result["success"] = False
|
274
262
|
result["error"] = self._result_dict.get("error", "Erro desconhecido")
|
@@ -276,9 +264,7 @@ class ParallelRunner(Generic[T]):
|
|
276
264
|
result["traceback"] = self._result_dict["traceback"]
|
277
265
|
|
278
266
|
# Finaliza o Manager se o processo terminou e não estamos mais esperando resultado
|
279
|
-
if not self._process.is_alive() and (
|
280
|
-
result.get("success", False) or result.get("terminated", False)
|
281
|
-
):
|
267
|
+
if not self._process.is_alive() and (result.get("success", False) or result.get("terminated", False)):
|
282
268
|
self._cleanup()
|
283
269
|
|
284
270
|
return result
|
rpa_suite/core/print.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# rpa_suite/core/print.py
|
2
2
|
|
3
|
-
# imports
|
3
|
+
# imports third party
|
4
4
|
from colorama import Fore
|
5
5
|
|
6
6
|
|
@@ -126,9 +126,7 @@ class Print:
|
|
126
126
|
"""
|
127
127
|
print(f"{color}{string_text}{Colors.default}", end=ending)
|
128
128
|
|
129
|
-
def magenta_print(
|
130
|
-
self, string_text: str, color=Colors.magenta, ending="\n"
|
131
|
-
) -> None:
|
129
|
+
def magenta_print(self, string_text: str, color=Colors.magenta, ending="\n") -> None:
|
132
130
|
"""
|
133
131
|
Print customized with the color Magenta \n
|
134
132
|
|
@@ -162,9 +160,7 @@ class Print:
|
|
162
160
|
"""
|
163
161
|
print(f"{color}{string_text}{Colors.default}", end=ending)
|
164
162
|
|
165
|
-
def print_call_fn(
|
166
|
-
self, string_text: str, color=Colors.call_fn, ending="\n"
|
167
|
-
) -> None:
|
163
|
+
def print_call_fn(self, string_text: str, color=Colors.call_fn, ending="\n") -> None:
|
168
164
|
"""
|
169
165
|
Print customized for function called (log) \n
|
170
166
|
Color: Magenta Light
|
@@ -182,9 +178,7 @@ class Print:
|
|
182
178
|
"""
|
183
179
|
print(f"{color}{string_text}{Colors.default}", end=ending)
|
184
180
|
|
185
|
-
def print_retur_fn(
|
186
|
-
self, string_text: str, color=Colors.retur_fn, ending="\n"
|
187
|
-
) -> None:
|
181
|
+
def print_retur_fn(self, string_text: str, color=Colors.retur_fn, ending="\n") -> None:
|
188
182
|
"""
|
189
183
|
Print customized for function return (log) \n
|
190
184
|
Color: Yellow Light
|
rpa_suite/core/regex.py
CHANGED
rpa_suite/core/validate.py
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
# rpa_suite/core/mail_validator.py
|
2
2
|
|
3
|
+
# imports third party
|
4
|
+
import email_validator
|
5
|
+
|
3
6
|
# imports internal
|
4
7
|
from rpa_suite.functions._printer import error_print, success_print
|
5
8
|
|
6
|
-
# imports external
|
7
|
-
import email_validator
|
8
|
-
|
9
9
|
|
10
10
|
class Validate:
|
11
11
|
"""
|
@@ -200,15 +200,11 @@ class Validate:
|
|
200
200
|
else:
|
201
201
|
words_lowercase = [word.lower() for word in origin_words]
|
202
202
|
searched_word_lower = searched_word.lower()
|
203
|
-
result["number_occurrences"] = words_lowercase.count(
|
204
|
-
searched_word_lower
|
205
|
-
)
|
203
|
+
result["number_occurrences"] = words_lowercase.count(searched_word_lower)
|
206
204
|
result["is_found"] = result["number_occurrences"] > 0
|
207
205
|
|
208
206
|
except Exception as e:
|
209
|
-
return error_print(
|
210
|
-
f"Unable to complete the search: {searched_word}. Error: {str(e)}"
|
211
|
-
)
|
207
|
+
return error_print(f"Unable to complete the search: {searched_word}. Error: {str(e)}")
|
212
208
|
|
213
209
|
elif search_by == "string":
|
214
210
|
try:
|
@@ -218,20 +214,14 @@ class Validate:
|
|
218
214
|
else:
|
219
215
|
origin_text_lower = origin_text.lower()
|
220
216
|
searched_word_lower = searched_word.lower()
|
221
|
-
result["number_occurrences"] = origin_text_lower.count(
|
222
|
-
searched_word_lower
|
223
|
-
)
|
217
|
+
result["number_occurrences"] = origin_text_lower.count(searched_word_lower)
|
224
218
|
result["is_found"] = result["number_occurrences"] > 0
|
225
219
|
|
226
220
|
except Exception as e:
|
227
|
-
return error_print(
|
228
|
-
f"Unable to complete the search: {searched_word}. Error: {str(e)}"
|
229
|
-
)
|
221
|
+
return error_print(f"Unable to complete the search: {searched_word}. Error: {str(e)}")
|
230
222
|
|
231
223
|
except Exception as e:
|
232
|
-
return error_print(
|
233
|
-
f"Unable to search for: {searched_word}. Error: {str(e)}"
|
234
|
-
)
|
224
|
+
return error_print(f"Unable to search for: {searched_word}. Error: {str(e)}")
|
235
225
|
|
236
226
|
# Postprocessing
|
237
227
|
if result["is_found"]:
|
@@ -76,16 +76,12 @@ def __create_ss_dir(
|
|
76
76
|
except PermissionError:
|
77
77
|
result["success"] = False
|
78
78
|
result["path_created"] = None
|
79
|
-
alert_print(
|
80
|
-
f"Permissão negada: não é possível criar o diretório '{full_path}'."
|
81
|
-
)
|
79
|
+
alert_print(f"Permissão negada: não é possível criar o diretório '{full_path}'.")
|
82
80
|
|
83
81
|
except Exception as e:
|
84
82
|
result["success"] = False
|
85
83
|
result["path_created"] = None
|
86
|
-
error_print(
|
87
|
-
f"Error capturing current path to create screenshots directory! Error: {str(e)}"
|
88
|
-
)
|
84
|
+
error_print(f"Error capturing current path to create screenshots directory! Error: {str(e)}")
|
89
85
|
|
90
86
|
finally:
|
91
87
|
return result
|
rpa_suite/functions/__init__.py
CHANGED
rpa_suite/suite.py
CHANGED
@@ -153,9 +153,7 @@ class Suite:
|
|
153
153
|
import importlib.util
|
154
154
|
|
155
155
|
# from .browser import Browser
|
156
|
-
if importlib.util.find_spec("selenium") and importlib.util.find_spec(
|
157
|
-
"webdriver_manager"
|
158
|
-
):
|
156
|
+
if importlib.util.find_spec("selenium") and importlib.util.find_spec("webdriver_manager"):
|
159
157
|
from .core.browser import Browser
|
160
158
|
|
161
159
|
browser: Browser = Browser
|
@@ -163,9 +161,9 @@ class Suite:
|
|
163
161
|
# VARIABLES INTERNAL
|
164
162
|
try:
|
165
163
|
# old: __version__ = pkg_resources.get_distribution("rpa_suite").version
|
166
|
-
|
164
|
+
|
167
165
|
__version__ = version("package_name")
|
168
|
-
|
166
|
+
|
169
167
|
except Exception:
|
170
168
|
__version__ = "unknown"
|
171
169
|
|
@@ -242,9 +240,7 @@ class Suite:
|
|
242
240
|
"""
|
243
241
|
print(f"{color}{string_text}{Colors.default}", end=ending)
|
244
242
|
|
245
|
-
def magenta_print(
|
246
|
-
self, string_text: str, color=Colors.magenta, ending="\n"
|
247
|
-
) -> None:
|
243
|
+
def magenta_print(self, string_text: str, color=Colors.magenta, ending="\n") -> None:
|
248
244
|
"""
|
249
245
|
Print customized with the color Magenta \n
|
250
246
|
|
@@ -278,9 +274,7 @@ class Suite:
|
|
278
274
|
"""
|
279
275
|
print(f"{color}{string_text}{Colors.default}", end=ending)
|
280
276
|
|
281
|
-
def print_call_fn(
|
282
|
-
self, string_text: str, color=Colors.call_fn, ending="\n"
|
283
|
-
) -> None:
|
277
|
+
def print_call_fn(self, string_text: str, color=Colors.call_fn, ending="\n") -> None:
|
284
278
|
"""
|
285
279
|
Print customized for function called (log) \n
|
286
280
|
Color: Magenta Light
|
@@ -298,9 +292,7 @@ class Suite:
|
|
298
292
|
"""
|
299
293
|
print(f"{color}{string_text}{Colors.default}", end=ending)
|
300
294
|
|
301
|
-
def print_retur_fn(
|
302
|
-
self, string_text: str, color=Colors.retur_fn, ending="\n"
|
303
|
-
) -> None:
|
295
|
+
def print_retur_fn(self, string_text: str, color=Colors.retur_fn, ending="\n") -> None:
|
304
296
|
"""
|
305
297
|
Print customized for function return (log) \n
|
306
298
|
Color: Yellow Light
|
rpa_suite/utils/__init__.py
CHANGED
rpa_suite/utils/system.py
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
# rpa_suite/utils/system.py
|
2
2
|
|
3
|
+
# imports third-party
|
4
|
+
import sys
|
5
|
+
import os
|
6
|
+
import ctypes
|
7
|
+
|
3
8
|
# imports internal
|
4
9
|
from rpa_suite.functions._printer import error_print, success_print
|
5
10
|
|
6
|
-
# imports third-party
|
7
|
-
import sys, os, ctypes
|
8
|
-
|
9
11
|
|
10
12
|
class Utils:
|
11
13
|
"""
|
@@ -13,8 +15,8 @@ class Utils:
|
|
13
15
|
|
14
16
|
Fornece métodos para manipulação de caminhos de importação e configurações do sistema.
|
15
17
|
"""
|
16
|
-
|
17
|
-
def __init__(self):
|
18
|
+
|
19
|
+
def __init__(self):
|
18
20
|
"""
|
19
21
|
Inicializa a classe Utils.
|
20
22
|
|
@@ -25,18 +27,17 @@ class Utils:
|
|
25
27
|
except Exception as e:
|
26
28
|
error_print(f"Erro durante a inicialização da classe Utils: {str(e)}.")
|
27
29
|
|
28
|
-
|
29
30
|
def set_importable_dir(self, display_message: bool = False) -> None:
|
30
31
|
"""
|
31
32
|
Configura o diretório atual como importável, adicionando-o ao caminho do sistema.
|
32
33
|
|
33
|
-
Adiciona o diretório pai do módulo atual ao sys.path, permitindo importações
|
34
|
+
Adiciona o diretório pai do módulo atual ao sys.path, permitindo importações
|
34
35
|
dinâmicas de módulos locais.
|
35
36
|
|
36
37
|
Parâmetros:
|
37
38
|
----------
|
38
39
|
display_message : bool, opcional
|
39
|
-
Se True, exibe uma mensagem de sucesso após definir o diretório.
|
40
|
+
Se True, exibe uma mensagem de sucesso após definir o diretório.
|
40
41
|
Por padrão é False.
|
41
42
|
|
42
43
|
Retorna:
|
@@ -55,16 +56,14 @@ class Utils:
|
|
55
56
|
success_print("Diretório configurado com sucesso para importação!")
|
56
57
|
|
57
58
|
except Exception as e:
|
58
|
-
error_print(
|
59
|
-
f"Erro ao configurar diretório importável: {str(e)}."
|
60
|
-
)
|
59
|
+
error_print(f"Erro ao configurar diretório importável: {str(e)}.")
|
61
60
|
|
62
61
|
|
63
62
|
class KeepSessionActive:
|
64
63
|
"""
|
65
64
|
Gerenciador de contexto avançado para prevenir bloqueio de tela no Windows.
|
66
65
|
|
67
|
-
Utiliza chamadas de API do Windows para manter o sistema ativo durante
|
66
|
+
Utiliza chamadas de API do Windows para manter o sistema ativo durante
|
68
67
|
execução de tarefas críticas, impedindo suspensão ou bloqueio de tela.
|
69
68
|
|
70
69
|
Atributos de Classe:
|
@@ -87,7 +86,7 @@ class KeepSessionActive:
|
|
87
86
|
"""
|
88
87
|
Inicializa as configurações de estado de execução do sistema.
|
89
88
|
|
90
|
-
Configura constantes específicas do Windows para controle de energia
|
89
|
+
Configura constantes específicas do Windows para controle de energia
|
91
90
|
e gerenciamento de estado do sistema operacional.
|
92
91
|
"""
|
93
92
|
try:
|
@@ -96,13 +95,12 @@ class KeepSessionActive:
|
|
96
95
|
self.ES_DISPLAY_REQUIRED = 0x00000002
|
97
96
|
except Exception as e:
|
98
97
|
error_print(f"Erro ao inicializar KeepSessionActive: {str(e)}.")
|
99
|
-
|
100
98
|
|
101
99
|
def __enter__(self) -> None:
|
102
100
|
"""
|
103
101
|
Configura o estado de execução para prevenir bloqueio de tela.
|
104
102
|
|
105
|
-
Utiliza chamada de API do Windows para manter sistema e display ativos
|
103
|
+
Utiliza chamada de API do Windows para manter sistema e display ativos
|
106
104
|
durante a execução do bloco de código.
|
107
105
|
|
108
106
|
Retorna:
|
@@ -122,13 +120,12 @@ class KeepSessionActive:
|
|
122
120
|
except Exception as e:
|
123
121
|
error_print(f"Erro ao configurar estado de execução: {str(e)}.")
|
124
122
|
return self
|
125
|
-
|
126
123
|
|
127
124
|
def __exit__(self, exc_type, exc_val, exc_tb) -> None:
|
128
125
|
"""
|
129
126
|
Restaura as configurações padrão de energia do sistema.
|
130
127
|
|
131
|
-
Método chamado automaticamente ao sair do bloco de contexto,
|
128
|
+
Método chamado automaticamente ao sair do bloco de contexto,
|
132
129
|
revertendo as configurações de estado de execução para o padrão.
|
133
130
|
|
134
131
|
Parâmetros:
|
@@ -149,10 +146,12 @@ class KeepSessionActive:
|
|
149
146
|
except Exception as e:
|
150
147
|
error_print(f"Erro ao restaurar estado de execução: {str(e)}.")
|
151
148
|
|
149
|
+
|
152
150
|
class Tools(Utils):
|
153
151
|
"""
|
154
152
|
Classe utilitária para gerenciamento de configurações de sistema e diretórios.
|
155
153
|
|
156
154
|
Fornece métodos para manipulação de caminhos de importação e configurações do sistema.
|
157
155
|
"""
|
156
|
+
|
158
157
|
keep_session_active: KeepSessionActive = KeepSessionActive
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: rpa_suite
|
3
|
-
Version: 1.5.
|
3
|
+
Version: 1.5.9
|
4
4
|
Summary: Conjunto de ferramentas essenciais para Automação RPA com Python, que facilitam o dia a dia de desenvolvimento.
|
5
5
|
Author: Camilo Costa de Carvalho
|
6
6
|
Author-email: camilo.carvalho@vettracode.com
|
@@ -284,23 +284,25 @@ O módulo principal do rpa-suite é dividido em categorias. Cada categoria cont
|
|
284
284
|
|
285
285
|
## Release Notes
|
286
286
|
|
287
|
-
### Versão: **Beta 1.5.
|
287
|
+
### Versão: **Beta 1.5.9**
|
288
288
|
|
289
289
|
- **Data de Lançamento:** *20/02/2024*
|
290
|
-
- **Última Atualização:**
|
290
|
+
- **Última Atualização:** 06/06/2025
|
291
291
|
- **Status:** Em desenvolvimento
|
292
292
|
|
293
293
|
Esta versão marca um grande avanço no desenvolvimento da RPA Suite, trazendo melhorias significativas na arquitetura, novas funcionalidades e maior simplicidade no uso. Confira as principais mudanças abaixo.
|
294
294
|
|
295
295
|
### Notas da atualização:
|
296
296
|
|
297
|
-
-
|
298
|
-
-
|
299
|
-
-
|
300
|
-
-
|
301
|
-
-
|
302
|
-
-
|
303
|
-
-
|
297
|
+
- Atualização de Linters e Formatters
|
298
|
+
- black
|
299
|
+
- pylint
|
300
|
+
- bandit
|
301
|
+
- flake8
|
302
|
+
- isort
|
303
|
+
- pyupgrade
|
304
|
+
- detect-secrets
|
305
|
+
- autoflake
|
304
306
|
|
305
307
|
|
306
308
|
## Mais Sobre
|
@@ -0,0 +1,25 @@
|
|
1
|
+
rpa_suite/__init__.py,sha256=uk4XRRpZn734AlzjPgvbmW0mO384jmOdYOZ8a0c--Q8,2365
|
2
|
+
rpa_suite/suite.py,sha256=E4UDl4SgLSu2c2yI-qmK48NbQH2WwjSfvq3MAjmGnJ4,10568
|
3
|
+
rpa_suite/core/__init__.py,sha256=2KWotqRNuCNwVhACACB4zhrXnTWR9H77_6U6j0WTJK0,1738
|
4
|
+
rpa_suite/core/asyncrun.py,sha256=gRKsqvT4QAwg906BkLQXHi-oMbjM30D3yRWV1qAqj1Y,4192
|
5
|
+
rpa_suite/core/browser.py,sha256=NeJk8lWDKZcGR9ULfWkDZ4WmFujU-DVr5-QH0qUSSgU,14725
|
6
|
+
rpa_suite/core/clock.py,sha256=ELhgehLoqrf5bjkDpJ8wkcha9YmsnIfLb0qQW7OKrzw,13161
|
7
|
+
rpa_suite/core/date.py,sha256=nnAktYMZNjcN4e6HEiYJgdMLD5VZluaOjfyfSPaz71c,6307
|
8
|
+
rpa_suite/core/dir.py,sha256=ZfgFeCkl8iB8Tc5dST35olImpj4PoWThovNYvtpwnu8,10329
|
9
|
+
rpa_suite/core/email.py,sha256=D69vPmoBJYwSTgDu5tvXhakvsYprXr0BAFRYeaVicx0,8473
|
10
|
+
rpa_suite/core/file.py,sha256=hCXoWiEGtxRfp5Uq33p0f2eDwKUv3dEiUSajOhpNwbc,11317
|
11
|
+
rpa_suite/core/log.py,sha256=9dPDnV8e4p9lwZoyd1ICb6CjJiiSXTXVJseQkdtdRuQ,6542
|
12
|
+
rpa_suite/core/parallel.py,sha256=a_aEqvoJ9jxsFg1H42wsPT2pCS3WApqbGc2PETgBBEs,11460
|
13
|
+
rpa_suite/core/print.py,sha256=i1icdpNreQf2DCO6uLQKuuUD0vsrsOnYSpiQGaGNJi4,5780
|
14
|
+
rpa_suite/core/regex.py,sha256=IHQF-xHVacDuloQqcBJdTCjd7oXVqDdbGa50Mb803Bk,3321
|
15
|
+
rpa_suite/core/validate.py,sha256=Msk_bL9pBuenuUzFv7Wg9L_z3zXq0lOHsDavkwfaAn0,10620
|
16
|
+
rpa_suite/functions/__create_ss_dir.py,sha256=kaRotLlYDCQGKtv9nd8zZUorQmHYGbHmOEWJ1DZBBYc,3426
|
17
|
+
rpa_suite/functions/__init__.py,sha256=Y9Kp8tTmyCcQ4sErjb0c2cbDNTAAoTArEF2pYl7mt5s,57
|
18
|
+
rpa_suite/functions/_printer.py,sha256=gj7dwOt4roSj2iwOGWeGgUD3JVr7h4UESyCg9CmrieA,3946
|
19
|
+
rpa_suite/utils/__init__.py,sha256=bqxq5kckulcQzNCn1tHwHj0WMIQBTUYNDzMzBhLtbIY,729
|
20
|
+
rpa_suite/utils/system.py,sha256=kkTsjwBQ-8_G_6l-0tuwkpmeI3KVssRZ7QAiYlR3vt0,5185
|
21
|
+
rpa_suite-1.5.9.dist-info/licenses/LICENSE,sha256=5D8PIbs31iGd9i1_MDNg4SzaQnp9sEIULALh2y3WyMI,1102
|
22
|
+
rpa_suite-1.5.9.dist-info/METADATA,sha256=Cb7VubI35_hoUBEU8Tkz1RQke7yFpqkAyUUBfo9ydbs,12978
|
23
|
+
rpa_suite-1.5.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
24
|
+
rpa_suite-1.5.9.dist-info/top_level.txt,sha256=HYkDtg-kJNAr3F2XAIPyJ-QBbNhk7q6jrqsFt10lz4Y,10
|
25
|
+
rpa_suite-1.5.9.dist-info/RECORD,,
|
rpa_suite-1.5.8.dist-info/RECORD
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
rpa_suite/__init__.py,sha256=PGlr0Y0NLLH1sarD1VTv-Tvm_uZPmo1Ar4LLncvUVFU,2365
|
2
|
-
rpa_suite/suite.py,sha256=fIbli4MCBVKXvv5JFmzudcEZATYMFyvx9rIK9CceorI,10648
|
3
|
-
rpa_suite/core/__init__.py,sha256=clmYBLmsmFRXGMABUjIkV-dBe_OlviowszdIJEwS-yM,1748
|
4
|
-
rpa_suite/core/asyncrun.py,sha256=bE04H36V01LavLRzGMhaUDBrnwhwLLSqpzKRZjsHVnA,4195
|
5
|
-
rpa_suite/core/browser.py,sha256=tew_SaTBVsWZHi66O41GOLMrdoR1XvgQmtoBMjGa9iE,15009
|
6
|
-
rpa_suite/core/clock.py,sha256=T8ilbWrmGwhRGBAVRCCvICWQ1_uu2VjDTJgNEljPYhY,13414
|
7
|
-
rpa_suite/core/date.py,sha256=42Nwvyx-FBBImEyVhBGksmIZ9VSwyFqhQPVeEwSpmtc,6310
|
8
|
-
rpa_suite/core/dir.py,sha256=sN9R-XGIrySAyUYIB3XVHzaZR5ZqcX2Ag-pKZ6G3jpY,10301
|
9
|
-
rpa_suite/core/email.py,sha256=kH6wFPxekXxhqt4ry_gWOzVeV_YBSIzb_xr5CL9FR_8,8741
|
10
|
-
rpa_suite/core/file.py,sha256=plj_sC-j2j2IEQ5NRTssnSNPaPGLBg-RjPwGZPpWsIo,11441
|
11
|
-
rpa_suite/core/log.py,sha256=ieaAKO3R4H8YW8jcg9KMRjfKd1iRcjGzh2husVnQjgc,6678
|
12
|
-
rpa_suite/core/parallel.py,sha256=nmATr6KimkAplDeh-dGwP6iB9muJ7ygDQ3NoYkEYgIg,11709
|
13
|
-
rpa_suite/core/print.py,sha256=T-O4zaYzfPLKn5tEzgNrWOqRV_p4hAzT-c1Y3JDla24,5825
|
14
|
-
rpa_suite/core/regex.py,sha256=76NjtLaIFM4LuTWLAOusQoOcP_Rub_G2ol9H6CIkTMg,3324
|
15
|
-
rpa_suite/core/validate.py,sha256=gOISOwjCza-18kfpaZnWCrKj4aIk2s7U4mStBDUAC7E,10857
|
16
|
-
rpa_suite/functions/__create_ss_dir.py,sha256=oAvZCMRgrBNUpaYGEiNlUFa1XiVYDfOqPb9M8ITxqG8,3482
|
17
|
-
rpa_suite/functions/__init__.py,sha256=nXet0AfuyaazPrJUzfCgE382hONS3QqxDLydo75J6NU,57
|
18
|
-
rpa_suite/functions/_printer.py,sha256=gj7dwOt4roSj2iwOGWeGgUD3JVr7h4UESyCg9CmrieA,3946
|
19
|
-
rpa_suite/utils/__init__.py,sha256=FeMyn0dSuj8gMBrvzk-61mkz4F_hPT6l--vDyMWjxYw,729
|
20
|
-
rpa_suite/utils/system.py,sha256=5ggEJoIZttoFZ46SKoQJoMp65exsYDQrzeDqzxqtMP0,5224
|
21
|
-
rpa_suite-1.5.8.dist-info/licenses/LICENSE,sha256=5D8PIbs31iGd9i1_MDNg4SzaQnp9sEIULALh2y3WyMI,1102
|
22
|
-
rpa_suite-1.5.8.dist-info/METADATA,sha256=losVczz4q2NzB6P_Z6wrNkX9tneK8J4m9FpJaerGpHQ,13657
|
23
|
-
rpa_suite-1.5.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
24
|
-
rpa_suite-1.5.8.dist-info/top_level.txt,sha256=HYkDtg-kJNAr3F2XAIPyJ-QBbNhk7q6jrqsFt10lz4Y,10
|
25
|
-
rpa_suite-1.5.8.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|