rpa-suite 1.5.8__tar.gz → 1.5.9__tar.gz

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 (32) hide show
  1. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/PKG-INFO +12 -10
  2. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/README.md +11 -9
  3. rpa_suite-1.5.9/pyproject.toml +38 -0
  4. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/__init__.py +1 -1
  5. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/core/__init__.py +2 -5
  6. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/core/asyncrun.py +1 -1
  7. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/core/browser.py +18 -33
  8. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/core/clock.py +12 -26
  9. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/core/date.py +4 -4
  10. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/core/dir.py +17 -21
  11. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/core/email.py +9 -18
  12. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/core/file.py +16 -23
  13. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/core/log.py +16 -20
  14. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/core/parallel.py +8 -22
  15. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/core/print.py +4 -10
  16. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/core/regex.py +3 -3
  17. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/core/validate.py +8 -18
  18. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/functions/__create_ss_dir.py +2 -6
  19. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/functions/__init__.py +1 -1
  20. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/suite.py +6 -14
  21. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/utils/__init__.py +1 -1
  22. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/utils/system.py +16 -17
  23. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite.egg-info/PKG-INFO +12 -10
  24. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite.egg-info/SOURCES.txt +1 -0
  25. rpa_suite-1.5.9/setup.py +43 -0
  26. rpa_suite-1.5.8/setup.py +0 -33
  27. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/LICENSE +0 -0
  28. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite/functions/_printer.py +0 -0
  29. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite.egg-info/dependency_links.txt +0 -0
  30. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite.egg-info/requires.txt +0 -0
  31. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/rpa_suite.egg-info/top_level.txt +0 -0
  32. {rpa_suite-1.5.8 → rpa_suite-1.5.9}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rpa_suite
3
- Version: 1.5.8
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.8**
287
+ ### Versão: **Beta 1.5.9**
288
288
 
289
289
  - **Data de Lançamento:** *20/02/2024*
290
- - **Última Atualização:** 02/06/2025
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
- - Submódulos agora são objetos internos do objeto principal `Suite`, acessíveis via `rpa.modulo.function()` ou diretamente pelo submódulo.
298
- - Estrutura reformulada para maior simplicidade, com pastas `core` (núcleo) e `utils` (ferramentas utilitárias).
299
- - Novo submódulo `ParallelRunner` (`Parallel`) para execução de processos em paralelo com suporte a timeout e recuperação de resultados.
300
- - Novo submódulo `AsyncRunner` (`Asyn`) para facilitar o uso de funções assíncronas com menos código.
301
- - Adicionado suporte à automação de navegadores (inicialmente apenas Chrome).
302
- - Melhorias nas descrições e adição de docstrings em todas as funções e objetos.
303
- - Submódulo de logs unificado com Loguru, agora com suporte a configuração de diretórios, nomes de arquivos e streams para console e arquivo.
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
@@ -239,23 +239,25 @@ O módulo principal do rpa-suite é dividido em categorias. Cada categoria cont
239
239
 
240
240
  ## Release Notes
241
241
 
242
- ### Versão: **Beta 1.5.8**
242
+ ### Versão: **Beta 1.5.9**
243
243
 
244
244
  - **Data de Lançamento:** *20/02/2024*
245
- - **Última Atualização:** 02/06/2025
245
+ - **Última Atualização:** 06/06/2025
246
246
  - **Status:** Em desenvolvimento
247
247
 
248
248
  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.
249
249
 
250
250
  ### Notas da atualização:
251
251
 
252
- - Submódulos agora são objetos internos do objeto principal `Suite`, acessíveis via `rpa.modulo.function()` ou diretamente pelo submódulo.
253
- - Estrutura reformulada para maior simplicidade, com pastas `core` (núcleo) e `utils` (ferramentas utilitárias).
254
- - Novo submódulo `ParallelRunner` (`Parallel`) para execução de processos em paralelo com suporte a timeout e recuperação de resultados.
255
- - Novo submódulo `AsyncRunner` (`Asyn`) para facilitar o uso de funções assíncronas com menos código.
256
- - Adicionado suporte à automação de navegadores (inicialmente apenas Chrome).
257
- - Melhorias nas descrições e adição de docstrings em todas as funções e objetos.
258
- - Submódulo de logs unificado com Loguru, agora com suporte a configuração de diretórios, nomes de arquivos e streams para console e arquivo.
252
+ - Atualização de Linters e Formatters
253
+ - black
254
+ - pylint
255
+ - bandit
256
+ - flake8
257
+ - isort
258
+ - pyupgrade
259
+ - detect-secrets
260
+ - autoflake
259
261
 
260
262
 
261
263
  ## Mais Sobre
@@ -0,0 +1,38 @@
1
+ [tool.isort]
2
+ profile = "black"
3
+ multi_line_output = 3
4
+ include_trailing_comma = true
5
+ force_grid_wrap = 0
6
+ use_parentheses = true
7
+ ensure_newline_before_comments = true
8
+ line_length = 120
9
+
10
+ [tool.black]
11
+ line-length = 120
12
+
13
+ [tool.pylint.FORMAT]
14
+ max-line-length = 120
15
+
16
+ [tool.pylint.'MESSAGES CONTROL']
17
+ disable = [
18
+ "C0114", # missing-module-docstring
19
+ "C0115", # missing-class-docstring
20
+ "C0116", # missing-function-docstring
21
+ "R0903", # too-many-instance-attributes
22
+ "R0902", # too-many-instance-attributes
23
+ "W0718", # broad-exception-caught
24
+ "W0719", # broad-exception-raised
25
+ "C0301", # line-too-long
26
+ "C0103", # invalid-name
27
+ "R0915", # too-many-statements
28
+ "R0913", # too-many-arguments
29
+ ]
30
+
31
+ # Permitir módulos compilados em C
32
+ extension-pkg-allow-list = [
33
+ "win32api",
34
+ "win32gui",
35
+ "win32process",
36
+ "win32con",
37
+ "pywintypes"
38
+ ]
@@ -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__ = '1.5.5'
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
@@ -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__ = '1.5.5'
51
-
48
+ __version__ = "1.5.5"
@@ -1,6 +1,6 @@
1
1
  # rpa_suite/core/asyncrun.py
2
2
 
3
- # imports third-party
3
+ # imports standard
4
4
  from typing import Any, Callable, Dict, Optional, TypeVar, Generic
5
5
  import asyncio
6
6
  import time
@@ -1,9 +1,11 @@
1
1
  # rpa_suite/core/browser.py
2
2
 
3
- # imports internal
4
- from rpa_suite.functions._printer import error_print, alert_print, success_print
3
+ # imports standard
4
+ from time import sleep
5
+ import os
6
+ import requests
5
7
 
6
- # imports external
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 third-party
15
- from time import sleep
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(f"Browser: Fechado via força!")
295
+ alert_print("Browser: Fechado via força!")
307
296
 
308
297
  else:
309
298
  if display_message:
310
- success_print(f"Browser: Fechado com sucesso!")
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(f"Browser: Fechado via força extrema!")
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)}!")
@@ -1,13 +1,13 @@
1
1
  # rpa_suite/core/clock.py
2
2
 
3
- # imports internal
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 == None:
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
@@ -1,13 +1,13 @@
1
1
  # rpa_suite/core/date.py
2
2
 
3
- # imports internal
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
  """
@@ -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
- finally:
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
- finally:
245
- return result
241
+ return result
@@ -1,16 +1,16 @@
1
1
  # rpa_suite/core/email.py
2
2
 
3
- # imports internal
4
- from rpa_suite.functions._printer import alert_print, error_print, success_print
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, but prints success or failure messages when sending the email.
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:
@@ -1,17 +1,17 @@
1
1
  # rpa_suite/core/file.py
2
2
 
3
- # imports internal
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 == None:
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 == None:
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 dir in dir_to_count:
268
- for _, _, files in os.walk(dir):
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
- finally:
284
- return result
277
+ return result
@@ -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 external
6
+ # imports third party
7
7
  from loguru import logger
8
8
 
9
- # imports third-party
9
+ # imports standard
10
10
  from typing import Optional as Op
11
- import sys, os, inspect
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: success_print(f"Diretório:'{self.full_path}' foi criado com sucesso.")
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: alert_print(f"Diretório:'{self.full_path}' já existe.")
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(
@@ -1,6 +1,6 @@
1
1
  # rpa_suite/core/parallel.py
2
2
 
3
- # imports third-party
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
@@ -1,6 +1,6 @@
1
1
  # rpa_suite/core/print.py
2
2
 
3
- # imports external
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
@@ -1,11 +1,11 @@
1
1
  # rpa_suite/core/regex.py
2
2
 
3
+ # imports standard
4
+ import re
5
+
3
6
  # imports internal
4
7
  from rpa_suite.functions._printer import error_print, success_print
5
8
 
6
- # imports third-party
7
- import re
8
-
9
9
 
10
10
  class Regex:
11
11
  """
@@ -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
@@ -1,3 +1,3 @@
1
1
  # rpa_suite/functions/__init__.py
2
2
 
3
- __version__ = '1.5.5'
3
+ __version__ = "1.5.5"
@@ -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
@@ -12,4 +12,4 @@ O módulo de utilitários da rpa-suite fornece uma coleção de funções e clas
12
12
  from .system import Tools
13
13
 
14
14
 
15
- __version__ = '1.5.5'
15
+ __version__ = "1.5.5"
@@ -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.8
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.8**
287
+ ### Versão: **Beta 1.5.9**
288
288
 
289
289
  - **Data de Lançamento:** *20/02/2024*
290
- - **Última Atualização:** 02/06/2025
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
- - Submódulos agora são objetos internos do objeto principal `Suite`, acessíveis via `rpa.modulo.function()` ou diretamente pelo submódulo.
298
- - Estrutura reformulada para maior simplicidade, com pastas `core` (núcleo) e `utils` (ferramentas utilitárias).
299
- - Novo submódulo `ParallelRunner` (`Parallel`) para execução de processos em paralelo com suporte a timeout e recuperação de resultados.
300
- - Novo submódulo `AsyncRunner` (`Asyn`) para facilitar o uso de funções assíncronas com menos código.
301
- - Adicionado suporte à automação de navegadores (inicialmente apenas Chrome).
302
- - Melhorias nas descrições e adição de docstrings em todas as funções e objetos.
303
- - Submódulo de logs unificado com Loguru, agora com suporte a configuração de diretórios, nomes de arquivos e streams para console e arquivo.
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
@@ -1,5 +1,6 @@
1
1
  LICENSE
2
2
  README.md
3
+ pyproject.toml
3
4
  setup.py
4
5
  rpa_suite/__init__.py
5
6
  rpa_suite/suite.py
@@ -0,0 +1,43 @@
1
+ from setuptools import setup, find_packages
2
+
3
+ setup(
4
+ name="rpa_suite",
5
+ version="1.5.9",
6
+ packages=find_packages(),
7
+ description="Conjunto de ferramentas essenciais para Automação RPA com Python, que facilitam o dia a dia de desenvolvimento.",
8
+ long_description_content_type="text/markdown",
9
+ long_description=open("README.md", "r", encoding="utf-8").read(),
10
+ author="Camilo Costa de Carvalho",
11
+ author_email="camilo.carvalho@vettracode.com",
12
+ license="MIT",
13
+ classifiers=[
14
+ "Development Status :: 3 - Alpha",
15
+ "Programming Language :: Python :: 3.11",
16
+ "Programming Language :: Python :: 3.12",
17
+ "Programming Language :: Python :: 3.13",
18
+ "License :: OSI Approved :: MIT License",
19
+ "Intended Audience :: Developers",
20
+ "Intended Audience :: Education",
21
+ "Intended Audience :: Science/Research",
22
+ "Operating System :: Microsoft :: Windows",
23
+ "Topic :: Scientific/Engineering :: Artificial Intelligence",
24
+ "Topic :: Software Development :: Libraries :: Python Modules",
25
+ ],
26
+ keywords="basic-tools, email-tools, email-validation, file-tools, simple-functions, rpa-tools, rpa-functions, Tools, Rpa, Automation, RPA, Automação, Python, Ferramentas de RPA, Automação de Processos, Biblioteca Python para RPA, Bot, Robô, Ferramentas de automação, automation-tools, workflow-automation, rpa-framework, python-bots, automation-library, rpa-development, python-automation-tools",
27
+ install_requires=[
28
+ "colorama",
29
+ "colorlog",
30
+ "email_validator",
31
+ "loguru",
32
+ "typing",
33
+ "pillow",
34
+ "pyautogui",
35
+ "requests",
36
+ "setuptools",
37
+ ],
38
+ project_urls={
39
+ "Código Fonte": "https://github.com/CamiloCCarvalho/rpasuite",
40
+ "Documentação": "https://github.com/CamiloCCarvalho/rpasuite/wiki",
41
+ "LinkedIn": "https://www.linkedin.com/in/camilocostac/",
42
+ },
43
+ )
rpa_suite-1.5.8/setup.py DELETED
@@ -1,33 +0,0 @@
1
- from setuptools import setup, find_packages
2
-
3
- setup(
4
- name='rpa_suite',
5
- version='1.5.8',
6
- packages=find_packages(),
7
- description='Conjunto de ferramentas essenciais para Automação RPA com Python, que facilitam o dia a dia de desenvolvimento.',
8
- long_description_content_type='text/markdown',
9
- long_description=open('README.md', 'r', encoding='utf-8').read(),
10
- author='Camilo Costa de Carvalho',
11
- author_email='camilo.carvalho@vettracode.com',
12
- license='MIT',
13
- classifiers=[
14
- 'Development Status :: 3 - Alpha',
15
- 'Programming Language :: Python :: 3.11',
16
- 'Programming Language :: Python :: 3.12',
17
- 'Programming Language :: Python :: 3.13',
18
- 'License :: OSI Approved :: MIT License',
19
- 'Intended Audience :: Developers',
20
- 'Intended Audience :: Education',
21
- 'Intended Audience :: Science/Research',
22
- 'Operating System :: Microsoft :: Windows',
23
- 'Topic :: Scientific/Engineering :: Artificial Intelligence',
24
- 'Topic :: Software Development :: Libraries :: Python Modules'
25
- ],
26
- keywords='basic-tools, email-tools, email-validation, file-tools, simple-functions, rpa-tools, rpa-functions, Tools, Rpa, Automation, RPA, Automação, Python, Ferramentas de RPA, Automação de Processos, Biblioteca Python para RPA, Bot, Robô, Ferramentas de automação, automation-tools, workflow-automation, rpa-framework, python-bots, automation-library, rpa-development, python-automation-tools',
27
- install_requires=['colorama', 'colorlog', 'email_validator', 'loguru', 'typing', 'pillow', 'pyautogui', 'requests', 'setuptools'],
28
- project_urls={
29
- "Código Fonte": "https://github.com/CamiloCCarvalho/rpasuite",
30
- "Documentação": "https://github.com/CamiloCCarvalho/rpasuite/wiki",
31
- "LinkedIn": "https://www.linkedin.com/in/camilocostac/",
32
- },
33
- )
File without changes
File without changes