rpa-suite 0.9.1__py3-none-any.whl → 0.9.4__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.
@@ -8,7 +8,7 @@ def exec_at_hour(
8
8
  fn_to_exec: Callable[..., Any],
9
9
  *args,
10
10
  **kwargs,
11
- ) -> dict:
11
+ ) -> dict[str, bool]:
12
12
 
13
13
  """
14
14
  Timed function, executes the function at the specified time, by ``default`` it executes at runtime, optionally you can choose the time for execution.
@@ -65,35 +65,18 @@ def exec_at_hour(
65
65
  minutes: str
66
66
  moment_now: str
67
67
 
68
- # Preprocessing
69
- run = True
70
- now = dt.now()
71
- hours = str(now.hour) if now.hour > 10 else f"0{now.hour}"
72
- minutes = str(now.minute) if now.minute > 10 else f"0{now.minute}"
73
- moment_now = f'{hours}:{minutes}'
74
-
75
- if hour_to_exec == None:
68
+ try:
69
+ # Preprocessing
70
+ run = True
71
+ now = dt.now()
72
+ hours = str(now.hour) if now.hour > 10 else f"0{now.hour}"
73
+ minutes = str(now.minute) if now.minute > 10 else f"0{now.minute}"
74
+ moment_now = f'{hours}:{minutes}'
76
75
 
77
- # Process
78
- while run:
79
- try:
80
- fn_to_exec(*args, **kwargs)
81
- run = False
82
- result['tried'] = not run
83
- result['success'] = True
84
- success_print(f'{fn_to_exec.__name__}: Successfully executed!')
85
- break
86
-
87
- except Exception as e:
88
- run = False
89
- result['tried'] = not run
90
- result['success'] = False
91
- error_print(f'An error occurred that prevented the function from executing: {fn_to_exec.__name__} correctly. Error: {str(e)}')
92
- break
93
- else:
94
- # Executes the function call only at the time provided in the argument.
95
- while run:
96
- if moment_now == hour_to_exec:
76
+ if hour_to_exec == None:
77
+
78
+ # Process
79
+ while run:
97
80
  try:
98
81
  fn_to_exec(*args, **kwargs)
99
82
  run = False
@@ -108,11 +91,35 @@ def exec_at_hour(
108
91
  result['success'] = False
109
92
  error_print(f'An error occurred that prevented the function from executing: {fn_to_exec.__name__} correctly. Error: {str(e)}')
110
93
  break
111
- else:
112
- time.sleep(30)
113
- now = dt.now()
114
- hours = str(now.hour) if now.hour > 10 else f"0{now.hour}"
115
- minutes = str(now.minute) if now.minute > 10 else f"0{now.minute}"
116
- moment_now = f'{hours}:{minutes}'
94
+ else:
95
+ # Executes the function call only at the time provided in the argument.
96
+ while run:
97
+ if moment_now == hour_to_exec:
98
+ try:
99
+ fn_to_exec(*args, **kwargs)
100
+ run = False
101
+ result['tried'] = not run
102
+ result['success'] = True
103
+ success_print(f'{fn_to_exec.__name__}: Successfully executed!')
104
+ break
105
+
106
+ except Exception as e:
107
+ run = False
108
+ result['tried'] = not run
109
+ result['success'] = False
110
+ error_print(f'An error occurred that prevented the function from executing: {fn_to_exec.__name__} correctly. Error: {str(e)}')
111
+ break
112
+ else:
113
+ time.sleep(30)
114
+ now = dt.now()
115
+ hours = str(now.hour) if now.hour > 10 else f"0{now.hour}"
116
+ minutes = str(now.minute) if now.minute > 10 else f"0{now.minute}"
117
+ moment_now = f'{hours}:{minutes}'
117
118
 
118
- return result
119
+ return result
120
+
121
+ except Exception as e:
122
+
123
+ result['success'] = False
124
+ error_print(f'An error occurred on function from executing: {fn_to_exec.__name__}. Error: {str(e)}')
125
+ return result
@@ -0,0 +1,36 @@
1
+ import schedule
2
+ import time
3
+ import subprocess
4
+
5
+ def run_python_script(script_path):
6
+ try:
7
+ subprocess.run(['python', script_path], check=True)
8
+ except subprocess.CalledProcessError as e:
9
+ print(f"Erro ao executar o script {script_path}: {e}")
10
+
11
+ def batch1():
12
+ # Substitua 'script1.py' pelo caminho do primeiro script Python que deseja executar
13
+ run_python_script('script1.py')
14
+
15
+ def batch2():
16
+ # Substitua 'script2.py' pelo caminho do segundo script Python que deseja executar
17
+ run_python_script('script2.py')
18
+
19
+ def batch3():
20
+ # Substitua 'script3.py' pelo caminho do terceiro script Python que deseja executar
21
+ run_python_script('script3.py')
22
+
23
+ print("Aguardando nova execução...")
24
+
25
+ # Horário para executar o primeiro batch (substitua com o horário desejado)
26
+ schedule.every().day.at("08:00").do(batch1)
27
+
28
+ # Horário para executar o segundo batch (substitua com o horário desejado)
29
+ schedule.every().day.at("12:00").do(batch2)
30
+
31
+ # Horário para executar o terceiro batch (substitua com o horário desejado)
32
+ schedule.every().day.at("16:00").do(batch3)
33
+
34
+ while True:
35
+ schedule.run_pending()
36
+ time.sleep(1)
rpa_suite/clock/waiter.py CHANGED
@@ -7,7 +7,7 @@ def wait_for_exec(
7
7
  fn_to_exec: Callable[..., Any],
8
8
  *args,
9
9
  **kwargs
10
- ) -> dict:
10
+ ) -> dict[str, bool]:
11
11
 
12
12
  """
13
13
  Timer function, wait for a value in ``seconds`` to execute the function of the argument.
@@ -74,7 +74,7 @@ def exec_and_wait(
74
74
  fn_to_exec: Callable[..., Any],
75
75
  *args,
76
76
  **kwargs
77
- ) -> dict:
77
+ ) -> dict[str, bool]:
78
78
 
79
79
  """
80
80
  Timer function, executes a function and waits for the time in ``seconds``
rpa_suite/date/date.py CHANGED
@@ -1,9 +1,10 @@
1
1
  import datetime as dt
2
+ from typing import Optional as Op
3
+ from typing import Tuple
2
4
  from rpa_suite.log.printer import error_print
3
5
 
4
6
 
5
-
6
- def get_hms() -> tuple:
7
+ def get_hms() -> Tuple[Op[str], Op[str], Op[str]]:
7
8
 
8
9
  """
9
10
  Function to return hour, minute and second. The return is in the form of a tuple with strings being able to store and use the values individually.
@@ -63,10 +64,14 @@ def get_hms() -> tuple:
63
64
  hours[1:]
64
65
 
65
66
  return hours, minutes, seconds
67
+
66
68
  except Exception as e:
67
- return error_print(f'Unable to capture the time. Error: {str(e)}')
68
69
 
69
- def get_dma() -> tuple:
70
+ error_print(f'Unable to capture the time. Error: {str(e)}')
71
+ return None, None, None
72
+
73
+
74
+ def get_dma() -> Tuple[Op[str], Op[str], Op[str]]:
70
75
  """
71
76
  Function to return day, month and year. The return is in the form of a tuple with strings being able to store and use the values individually.
72
77
 
@@ -112,4 +117,6 @@ def get_dma() -> tuple:
112
117
  return day_got, month_got, year_got
113
118
 
114
119
  except Exception as e:
115
- return error_print(f'Unable to capture the time. Error: {str(e)}')
120
+
121
+ error_print(f'Unable to capture the time. Error: {str(e)}')
122
+ return None, None, None
@@ -122,6 +122,7 @@ def send_email(
122
122
 
123
123
  # Add Attachment
124
124
  if attachments:
125
+ result['qt_attach'] = 0
125
126
  result['attchament'] = True
126
127
  for path_to_attach in attachments:
127
128
  file_name = os.path.basename(path_to_attach)
@@ -170,7 +171,7 @@ def send_email(
170
171
  server_by_smtp.quit()
171
172
  result['success'] = True
172
173
  success_print(f'Email(s) Sent!')
173
-
174
+
174
175
 
175
176
  except smtplib.SMTPException as e:
176
177
  result['success'] = False
rpa_suite/file/counter.py CHANGED
@@ -1,53 +1,53 @@
1
1
  import os
2
+ from typing import Dict, List, Union
2
3
  from rpa_suite.log.printer import error_print, success_print
3
4
 
5
+
4
6
  def count_files(
5
- dir_to_count: list[str],
6
- type_extension: str = '*'
7
- ) -> dict:
8
-
7
+ dir_to_count: List[str],
8
+ type_extension: str = '*'
9
+ ) -> Dict[str, Union[bool, int]]:
10
+
9
11
  """
10
12
  Function responsible for counting files within a folder, considers subfolders to do the count, searches by file type, being all files by default. \n
11
-
13
+
12
14
  Parameters:
13
15
  ----------
14
16
  ``dir_to_count: list`` - should be a list, accepts more than one path to count files.
15
17
  ``type_extension: str`` - should be a string with the format/extension of the type of file you want to be searched for counting, if empty by default will be used ``*`` which will count all files.
16
18
 
17
-
18
19
  Return:
19
20
  ----------
20
21
  >>> type:dict
21
22
  * 'success': bool - represents if the action was performed successfully
22
23
  * 'qt': int - number that represents the quantity of files that were counted
23
-
24
+
24
25
  Description: pt-br
25
26
  ----------
26
27
  Função responsavel por fazer a contagem de arquivos dentro de uma pasta, considera subpastas para fazer a contagem, busca por tipo de arquivo, sendo todos arquivos por default. \n
27
-
28
+
28
29
  Parametros:
29
30
  ----------
30
31
  ``dir_to_count: list`` - deve ser uma lista, aceita mais de um caminho para contar arquivos.
31
32
  ``type_extension: str`` - deve ser uma string com o formato/extensão do tipo de arquivo que deseja ser buscado para contagem, se vazio por default sera usado ``*`` que contará todos arquivos.
32
33
 
33
-
34
34
  Retorno:
35
35
  ----------
36
36
  >>> type:dict
37
37
  * 'success': bool - representa se ação foi realizada com sucesso
38
38
  * 'qt': int - numero que representa a quantidade de arquivos que foram contados
39
39
  """
40
-
40
+
41
41
  # Local Variables
42
42
  result: dict = {
43
43
  'success': bool,
44
44
  'qt': int
45
45
  }
46
-
46
+
47
47
  # Preprocessing
48
- result['qt'] = 0
49
48
  result['success'] = False
50
-
49
+ result['qt'] = 0
50
+
51
51
  # Process
52
52
  try:
53
53
  for dir in dir_to_count:
@@ -57,9 +57,10 @@ def count_files(
57
57
  result['qt'] += 1
58
58
  result['success'] = True
59
59
  success_print(f'Function: {count_files.__name__} counted {result["qt"]} files.')
60
-
60
+
61
61
  except Exception as e:
62
62
  result['success'] = False
63
63
  error_print(f'Error when trying to count files! Error: {str(e)}')
64
-
65
- return result
64
+
65
+ finally:
66
+ return result
@@ -1,29 +1,35 @@
1
1
  import os, shutil
2
+ from typing import Union
2
3
  from rpa_suite.log.printer import error_print, alert_print, success_print
3
4
 
4
- def create_temp_dir(path_to_create: str = 'default') -> dict:
5
-
5
+
6
+ def create_temp_dir(path_to_create: str = 'default', name_temp_dir: str='temp') -> dict[str, Union[bool, str, None]]:
7
+
6
8
  """
7
9
  Function responsible for creating a temporary directory to work with files and etc. \n
8
-
10
+
9
11
  Parameters:
10
12
  ----------
11
13
  ``path_to_create: str`` - should be a string with the full path pointing to the folder where the temporary folder should be created, if it is empty the ``default`` value will be used which will create a folder in the current directory where the file containing this function was called.
12
-
14
+
15
+ ``name_temp_dir: str`` - should be a string representing the name of the temporary directory to be created. If it is empty, the ``temp`` value will be used as the default directory name.
16
+
13
17
  Return:
14
18
  ----------
15
19
  >>> type:dict
16
- * 'success': bool - represents if the action was performed successfully
17
- * 'path_created': str - path of the directory that was created in the process
20
+ * 'success': bool - represents case the action was performed successfully
21
+ * 'path_created': str - path of the directory that was created on the process
18
22
 
19
23
  Description: pt-br
20
24
  ----------
21
25
  Função responsavel por criar diretório temporário para trabalhar com arquivos e etc. \n
22
-
26
+
23
27
  Parametros:
24
28
  ----------
25
29
  ``path_to_create: str`` - deve ser uma string com o path completo apontando para a pasta onde deve ser criada a pasta temporaria, se estiver vazio sera usado valor ``default`` que criará pasta no diretório atual onde o arquivo contendo esta função foi chamada.
26
-
30
+
31
+ ``name_temp_dir: str`` - deve ser uma string representando o nome do diretório temporário a ser criado. Se estiver vazio, o valor ``temp`` será usado como o nome padrão do diretório.
32
+
27
33
  Retorno:
28
34
  ----------
29
35
  >>> type:dict
@@ -34,128 +40,132 @@ def create_temp_dir(path_to_create: str = 'default') -> dict:
34
40
  # Local Variables
35
41
  result: dict = {
36
42
  'success': bool,
37
- 'path_created': str
43
+ 'path_created': str,
38
44
  }
39
45
 
40
- # Preprocessing
41
- default_dir: str
42
46
  try:
47
+ # by 'default', defines path to local script execution path
43
48
  if path_to_create == 'default':
44
- default_dir = os.path.dirname(os.path.abspath(__file__))
45
- else:
46
- default_dir = fr'{path_to_create}'
49
+ path_to_create: str = os.getcwd()
50
+
51
+ # Build path to new dir
52
+ full_path: str = os.path.join(path_to_create, name_temp_dir)
53
+
54
+ # Create dir in this block
55
+ try:
56
+
57
+ # Successefully created
58
+ os.makedirs(full_path, exist_ok=False)
59
+
60
+ result['success'] = True
61
+ result['path_created'] = fr'{full_path}'
62
+
63
+ success_print(f"Diretório:'{full_path}' foi criado com sucesso.")
64
+
65
+ except FileExistsError:
66
+ result['success'] = False
67
+ result['path_created'] = None
68
+ alert_print(f"Diretório:'{full_path}' já existe.")
69
+
70
+ except PermissionError:
71
+ result['success'] = False
72
+ result['path_created'] = None
73
+ alert_print(f"Permissão negada: não é possível criar o diretório '{full_path}'.")
74
+
47
75
  except Exception as e:
48
76
  result['success'] = False
77
+ result['path_created'] = None
49
78
  error_print(f'Error capturing current path to create temporary directory! Error: {str(e)}')
50
79
 
51
- # Process
52
- try:
53
- if not os.path.exists(fr'{default_dir}\temp'):
54
- try:
55
- os.mkdir(fr'{default_dir}\temp')
56
- if os.path.exists(fr'{default_dir}\temp'):
57
- result['success'] = True
58
- success_print(fr'Directory created in: {default_dir}\temp')
59
- else:
60
- result['success'] = False
61
- raise Exception
62
- except Exception as e:
63
- error_print(f'Unable to create temporary directory! Error: {str(e)}')
64
- else:
65
- result['success'] = True
66
- alert_print(fr'NOTICE! directory already exists in: {default_dir}\temp ')
67
- except Exception as e:
68
- error_print(f'Error when trying to create temporary directory in: {default_dir} - Error: {str(e)}')
69
-
70
- # Postprocessing
71
- result['path_created'] = fr'{default_dir}\temp'
72
-
73
- return result
80
+ finally:
81
+ return result
74
82
 
75
83
 
76
- def clear_temp_dir(path_to_clear: str = 'default', name_dir: str = '') -> dict:
77
-
84
+ def delete_temp_dir(path_to_delete: str = 'default', name_temp_dir: str='temp', delete_files: bool = False) -> dict[str, Union[bool, str, None]]:
85
+
78
86
  """
79
- Function responsible for cleaning the temporary directory at the specified path. \n
87
+ Function responsible for deleting a temporary directory. \n
80
88
 
81
89
  Parameters:
82
90
  ----------
83
- ``path_to_cleaned: str`` - a string that points to the destination to be cleaned, which can be: \n
84
- - relative path - based on the file where this function is being called
85
- - absolute path - based on the local disk of the machine or server
86
-
87
- If not declared or if the argument is left empty, then the ``default`` value will be used, which will search for the folder in the current directory where the file containing this function was called.
88
-
91
+ ``path_to_delete: str`` - should be a string with the full path pointing to the folder where the temporary folder should be deleted, if it is empty the ``default`` value will be used which will delete a folder in the current directory where the file containing this function was called.
92
+
93
+ ``name_temp_dir: str`` - should be a string representing the name of the temporary directory to be deleted. If it is empty, the ``temp`` value will be used as the default directory name.
94
+
95
+ ``delete_files: bool`` - should be a boolean indicating whether to delete files in the directory. If it is False, files in the directory will not be deleted.
96
+
89
97
  Return:
90
98
  ----------
91
99
  >>> type:dict
92
- * 'success': bool - represents if the action was performed successfully
93
- * 'path_cleaned': str - path of the directory that was cleaned in the process
100
+ * 'success': bool - represents case the action was performed successfully
101
+ * 'path_deleted': str - path of the directory that was deleted on the process
94
102
 
95
103
  Description: pt-br
96
104
  ----------
97
- Função responsavel por limpar o diretório temporário no caminho especificado. \n
98
-
105
+ Função responsavel por deletar diretório temporário. \n
106
+
99
107
  Parametros:
100
108
  ----------
101
- ``path_to_cleaned: str`` - uma string que aponta para o destino a limpar podendo ser: \n
102
- - caminho relativo - com base no arquivo onde esta sendo chamada a função
103
- - caminho absoluto - com base no disco local da maquina ou servidor
104
-
105
- não declarar ou deixar o argumento vazio então será usado valor ``default`` que buscará a pasta no diretório atual onde o arquivo contendo esta função foi chamada.
106
-
109
+ ``path_to_delete: str`` - deve ser uma string com o path completo apontando para a pasta onde deve ser deletada a pasta temporaria, se estiver vazio sera usado valor ``default`` que deletará pasta no diretório atual onde o arquivo contendo esta função foi chamada.
110
+
111
+ ``name_temp_dir: str`` - deve ser uma string representando o nome do diretório temporário a ser deletado. Se estiver vazio, o valor ``temp`` será usado como o nome padrão do diretório.
112
+
113
+ ``delete_files: bool`` - deve ser um booleano indicando se deve deletar arquivos no diretório. Se for False, arquivos no diretório não serão deletados.
114
+
107
115
  Retorno:
108
116
  ----------
109
117
  >>> type:dict
110
118
  * 'success': bool - representa se ação foi realizada com sucesso
111
- * 'path_cleaned': str - path do diretório que foi executada limpeza no processo
119
+ * 'path_deleted': str - path do diretório que foi deletado no processo
112
120
  """
113
-
121
+
114
122
  # Local Variables
115
- temp_dir_result: dict = {
123
+ result: dict = {
116
124
  'success': bool,
117
- 'path_cleaned': str
125
+ 'path_deleted': str,
118
126
  }
119
-
120
- # Preprocessing
121
- default_dir: str
122
- personal_name_dir_clear: str = 'temp' if name_dir == '' else name_dir
123
-
124
- # Process
125
- try:
126
- if path_to_clear == 'default':
127
- default_dir = os.path.dirname(os.path.abspath(__file__))
128
- else:
129
- default_dir = fr'{path_to_clear}'
130
- except Exception as e:
131
- temp_dir_result['success'] = False
132
- error_print(f'Unable to capture current path to clear temporary folder! Error: {str(e)}')
133
-
127
+
134
128
  try:
135
- if os.path.exists(fr'{default_dir}/{personal_name_dir_clear}'):
136
- for root, dirs, files in os.walk(fr'{default_dir}\{personal_name_dir_clear}', topdown=False):
137
- for name in files:
138
- try:
139
- os.remove(os.path.join(root, name))
140
- except:
141
- pass
142
- for name in dirs:
143
- try:
144
- os.rmdir(os.path.join(root, name))
145
- except:
146
- pass
147
- temp_dir_result['success'] = True
148
- success_print(fr'Directory cleaned: "{default_dir}\{personal_name_dir_clear}"')
149
- else:
150
- temp_dir_result['success'] = False
151
- temp_dir_result['path_cleaned'] = None
152
- alert_print(fr'Directory does not exist: "{default_dir}\{personal_name_dir_clear}"')
153
-
129
+ # by 'default', defines path to local script execution path
130
+ if path_to_delete == 'default':
131
+ path_to_delete: str = os.getcwd()
132
+
133
+ # Build path to new dir
134
+ full_path: str = os.path.join(path_to_delete, name_temp_dir)
135
+
136
+ # Delete dir in this block
137
+ try:
138
+
139
+ # Check if directory exists
140
+ if os.path.exists(full_path):
141
+
142
+ # Check if delete_files is True
143
+ if delete_files:
144
+ # Delete all files in the directory
145
+ shutil.rmtree(full_path)
146
+
147
+ else:
148
+ # Delete the directory only
149
+ os.rmdir(full_path)
150
+
151
+ result['success'] = True
152
+ result['path_deleted'] = fr'{full_path}'
153
+
154
+ success_print(f"Diretório:'{full_path}' foi deletado com sucesso.")
155
+ else:
156
+ result['success'] = False
157
+ result['path_deleted'] = None
158
+ alert_print(f"Diretório:'{full_path}' não existe.")
159
+
160
+ except PermissionError:
161
+ result['success'] = False
162
+ result['path_deleted'] = None
163
+ alert_print(f"Permissão negada: não é possível deletar o diretório '{full_path}'.")
164
+
154
165
  except Exception as e:
155
- error_print(fr'Error when trying to clear temporary directory: "{default_dir}\{personal_name_dir_clear}" - Error: {str(e)}')
166
+ result['success'] = False
167
+ result['path_deleted'] = None
168
+ error_print(f'Error capturing current path to delete temporary directory! Error: {str(e)}')
156
169
 
157
- # Postprocessing
158
- if temp_dir_result['success']:
159
- temp_dir_result['path_cleaned'] = fr'{default_dir}\{personal_name_dir_clear}'
160
-
161
- return temp_dir_result
170
+ finally:
171
+ return result
rpa_suite/log/loggin.py CHANGED
@@ -4,7 +4,7 @@ from loguru import logger
4
4
  def logging_decorator(
5
5
  fn: Callable
6
6
  ) -> Callable:
7
-
7
+
8
8
  """
9
9
  Function responsible for displaying log message in the console for functions that are called. \n
10
10
  Displays function name, and the result of the function in case of return, without return returns None.
rpa_suite/log/printer.py CHANGED
@@ -1,4 +1,4 @@
1
- from colorama import Fore, Back, Style
1
+ from colorama import Fore
2
2
 
3
3
  # Windows bash colors
4
4
  class Colors():
@@ -18,29 +18,30 @@ class Colors():
18
18
  def success_print(string_text: str, color=Colors.green, ending="\n") -> None:
19
19
  """
20
20
  Print that indicates ``SUCCESS``. Customized with the color Green \n
21
-
21
+
22
22
  Return:
23
23
  ----------
24
24
  >>> type:None
25
-
25
+
26
26
  pt-br
27
27
  ----------
28
28
  Print que indica ``SUCESSO``. Personalizado com a cor Verde \n
29
-
29
+
30
30
  Retorno:
31
31
  ----------
32
32
  >>> type:None
33
33
  """
34
- return print(f'{color} {string_text} {Colors.default}', end=ending)
34
+ print(f'{color} {string_text} {Colors.default}', end=ending)
35
+
35
36
 
36
37
  def alert_print(string_text: str, color=Colors.yellow, ending="\n") -> None:
37
38
  """
38
39
  Print that indicates ``ALERT``. Customized with the color Yellow \n
39
-
40
+
40
41
  Return:
41
42
  ----------
42
43
  >>> type:None
43
-
44
+
44
45
  pt-br
45
46
  ----------
46
47
  Print que indica ``ALERTA``. Personalizado com a cor Amarelo \n
@@ -48,16 +49,17 @@ def alert_print(string_text: str, color=Colors.yellow, ending="\n") -> None:
48
49
  ----------
49
50
  >>> type:None
50
51
  """
51
- return print(f'{color} {string_text} {Colors.default}', end=ending)
52
+ print(f'{color} {string_text} {Colors.default}', end=ending)
53
+
52
54
 
53
55
  def info_print(string_text: str, color=Colors.cyan, ending="\n") -> None:
54
56
  """
55
57
  Print that indicates ``INFORMATION``. Customized with the color Cyan \n
56
-
58
+
57
59
  Return:
58
60
  ----------
59
61
  >>> type:None
60
-
62
+
61
63
  pt-br
62
64
  ----------
63
65
  Print que indica ``INFORMATIVO``. Personalizado com a cor Ciano \n
@@ -65,16 +67,17 @@ def info_print(string_text: str, color=Colors.cyan, ending="\n") -> None:
65
67
  ----------
66
68
  >>> type:None
67
69
  """
68
- return print(f'{color} {string_text} {Colors.default}', end=ending)
70
+ print(f'{color} {string_text} {Colors.default}', end=ending)
71
+
69
72
 
70
73
  def error_print(string_text: str, color=Colors.red, ending="\n") -> None:
71
74
  """
72
75
  Print that indicates ``ERROR``. Customized with the color Red \n
73
-
76
+
74
77
  Return:
75
78
  ----------
76
79
  >>> type:None
77
-
80
+
78
81
  pt-br
79
82
  ----------
80
83
  Print que indica ``ERRO``. Personalizado com a cor Vermelho \n
@@ -82,16 +85,17 @@ def error_print(string_text: str, color=Colors.red, ending="\n") -> None:
82
85
  ----------
83
86
  >>> type:None
84
87
  """
85
- return print(f'{color} {string_text} {Colors.default}', end=ending)
88
+ print(f'{color} {string_text} {Colors.default}', end=ending)
89
+
86
90
 
87
91
  def magenta_print(string_text: str, color=Colors.magenta, ending="\n") -> None:
88
92
  """
89
93
  Print customized with the color Magenta \n
90
-
94
+
91
95
  Return:
92
96
  ----------
93
97
  >>> type:None
94
-
98
+
95
99
  pt-br
96
100
  ----------
97
101
  Print personalizado com a cor Magenta \n
@@ -99,16 +103,17 @@ def magenta_print(string_text: str, color=Colors.magenta, ending="\n") -> None:
99
103
  ----------
100
104
  >>> type:None
101
105
  """
102
- return print(f'{color} {string_text} {Colors.default}', end=ending)
106
+ print(f'{color} {string_text} {Colors.default}', end=ending)
107
+
103
108
 
104
109
  def blue_print(string_text: str, color=Colors.blue, ending="\n") -> None:
105
110
  """
106
111
  Print customized with the color Blue \n
107
-
112
+
108
113
  Return:
109
114
  ----------
110
115
  >>> type:None
111
-
116
+
112
117
  pt-br
113
118
  ----------
114
119
  Print personalizado com a cor Azul \n
@@ -116,7 +121,8 @@ def blue_print(string_text: str, color=Colors.blue, ending="\n") -> None:
116
121
  ----------
117
122
  >>> type:None
118
123
  """
119
- return print(f'{color} {string_text} {Colors.default}', end=ending)
124
+ print(f'{color} {string_text} {Colors.default}', end=ending)
125
+
120
126
 
121
127
  def print_call_fn(string_text: str, color=Colors.call_fn, ending="\n") -> None:
122
128
  """
@@ -125,7 +131,7 @@ def print_call_fn(string_text: str, color=Colors.call_fn, ending="\n") -> None:
125
131
  Return:
126
132
  ----------
127
133
  >>> type:None
128
-
134
+
129
135
  pt-br
130
136
  ----------
131
137
  Print personalizado para log de chamada de função. \n
@@ -134,7 +140,8 @@ def print_call_fn(string_text: str, color=Colors.call_fn, ending="\n") -> None:
134
140
  ----------
135
141
  >>> type:None
136
142
  """
137
- return print(f'{color} {string_text} {Colors.default}', end=ending)
143
+ print(f'{color} {string_text} {Colors.default}', end=ending)
144
+
138
145
 
139
146
  def print_retur_fn(string_text: str, color=Colors.retur_fn, ending="\n") -> None:
140
147
  """
@@ -143,7 +150,7 @@ def print_retur_fn(string_text: str, color=Colors.retur_fn, ending="\n") -> None
143
150
  Return:
144
151
  ----------
145
152
  >>> type:None
146
-
153
+
147
154
  pt-br
148
155
  ----------
149
156
  Print personalizado para log de chamada de função. \n
@@ -152,4 +159,4 @@ def print_retur_fn(string_text: str, color=Colors.retur_fn, ending="\n") -> None
152
159
  ----------
153
160
  >>> type:None
154
161
  """
155
- return print(f'{color} {string_text} {Colors.default}', end=ending)
162
+ print(f'{color} {string_text} {Colors.default}', end=ending)
@@ -3,9 +3,10 @@ from typing import Any
3
3
  from rpa_suite.log.printer import error_print, success_print
4
4
 
5
5
  def create_list_using_regex(origin_text: str, division_pattern: str) -> list[str] | Any:
6
+
6
7
  """
7
8
  Function responsible for searching in a string ``origin_text`` a pattern ``division_pattern`` and dividing the original text into substrings generating a list of strings, also does the cleaning and treatment to keep the list with the original strings, but divided
8
-
9
+
9
10
  Return:
10
11
  ----------
11
12
  A list of strings divided by the pattern used in the argument passed as a parameter.
@@ -13,11 +14,12 @@ def create_list_using_regex(origin_text: str, division_pattern: str) -> list[str
13
14
  Description: pt-br
14
15
  ----------
15
16
  Função responsável por buscar em um texto de leitura humana uma string ``origin_text`` por um padrão ``division_pattern`` e dividir o texto original em substrings gerando uma lista de strings, também faz a limpeza e tratamento para manter a lista com as strings originais, porem dividas
16
-
17
+
17
18
  Retorno:
18
19
  ----------
19
20
  Uma lista de strings dividas pelo padrão utilizada no argumento passado como parametro.
20
21
  """
22
+
21
23
  try:
22
24
  # creates a delimiter and uses it to split the string based on the pattern
23
25
  text_with_delim = re.sub(division_pattern, r'\1<DELIMITADOR>', origin_text)
@@ -33,11 +35,11 @@ def create_list_using_regex(origin_text: str, division_pattern: str) -> list[str
33
35
  # Removes the delimiter \n both left and right from each element of the list
34
36
  messages_striped = [msg.strip() for i, msg in enumerate(messages)]
35
37
  messages_lstriped = [msg.lstrip() for msg in messages_striped]
36
-
38
+
37
39
  # Removes the delimiter that has been placed between punctuation within the same pattern.
38
40
  messages_final = [msg.replace('\n', ' ') for msg in messages_lstriped]
39
41
  success_print(f'List generated successfully!')
40
42
  return messages_final
41
-
43
+
42
44
  except Exception as e:
43
- return error_print(f"Error when trying to create list using pattern-match (regex). Error: {str(e)}")
45
+ error_print(f"Error when trying to create list using pattern-match (regex). Error: {str(e)}")
rpa_suite/suite.py CHANGED
@@ -10,10 +10,10 @@ from .email.sender_smtp import send_email
10
10
 
11
11
  """MODULE FILE"""
12
12
  from .file.counter import count_files
13
- from .file.temp_dir import create_temp_dir, clear_temp_dir
13
+ from .file.temp_dir import create_temp_dir, delete_temp_dir
14
14
 
15
15
  """MODULE LOG"""
16
- from .log.loggin import logging_decorator
16
+ # from .log.loggin import logging_decorator
17
17
  from .log.printer import alert_print, success_print, error_print, info_print, print_call_fn, print_retur_fn, magenta_print, blue_print
18
18
 
19
19
  """MODULE REGEX"""
@@ -26,45 +26,46 @@ from .validate.string_validator import search_in
26
26
  class Rpa_suite():
27
27
  """
28
28
  The ``Rpa_suite`` class is a generic representation of the modules, with the aim of centralizing all submodules for access through an instance of this representational Object. It contains variables pointed to the functions of the submodules present in the rpa-site.
29
-
29
+
30
30
  Call
31
31
  ----------
32
32
  When calling the maintainer file of this class, an instance of this object will be invoked to be used or reused through another variable
33
-
33
+
34
34
  Objective
35
35
  ----------
36
36
  Flexibility being able to call each submodule individually or by importing the representational object of all submodules.
37
-
37
+
38
38
  Description: pt-br
39
39
  ----------
40
40
  Classe ``Rpa_suite`` é uma representação genérica do dos módulos, com objetivo de centralizar todos submódulos para acesso através de uma instância deste Objeto representacional. Ele contem variaveis apontadas para as funções dos submódulos presentes no rpa-site.
41
-
41
+
42
42
  Chamada
43
43
  ----------
44
44
  Ao chamar o arquivo mantenedor desta classe, sera invocada uma instancia deste objeto para poder ser utilziado ou reutilizado através de outra variável
45
-
45
+
46
46
  Objetivo
47
47
  ----------
48
48
  Flexibilidade podendo chamar cada submódulo de forma individual ou fazendo a importação do objeto representacional de todos submódulos.
49
49
  """
50
-
50
+
51
51
  # clock
52
52
  wait_for_exec = wait_for_exec
53
53
  exec_and_wait = exec_and_wait
54
54
  exec_at_hour = exec_at_hour
55
-
55
+
56
56
  # date
57
57
  get_hms = get_hms
58
58
  get_dma = get_dma
59
-
59
+
60
60
  # email
61
61
  send_email = send_email
62
-
62
+
63
63
  # file
64
64
  count_files = count_files
65
65
  create_temp_dir = create_temp_dir
66
- clear_temp_dir = clear_temp_dir
67
-
66
+ delete_temp_dir = delete_temp_dir
67
+ #clear_temp_dir = clear_temp_dir
68
+
68
69
  # log
69
70
  alert_print = alert_print
70
71
  success_print = success_print
@@ -74,18 +75,23 @@ class Rpa_suite():
74
75
  print_retur_fn = print_retur_fn
75
76
  magenta_print = magenta_print
76
77
  blue_print = blue_print
77
-
78
+
78
79
  # regex
79
80
  create_list_using_regex = create_list_using_regex
80
-
81
+
81
82
  # validate
82
83
  valid_emails = valid_emails
83
84
  search_in = search_in
84
-
85
+
85
86
  # Create a instance of Rpa_suite
86
87
 
87
88
 
88
89
  # Define function to return this instance
89
- def invoke():
90
+ def invoke() -> Rpa_suite:
91
+
92
+ """
93
+ Function responsible for return a object Rpa_suite with access all modules by .name_module or use 'from rpa_suite import suite' to >>> suite.functions_avaliable()
94
+ """
95
+
90
96
  suite = Rpa_suite()
91
97
  return suite
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rpa-suite
3
- Version: 0.9.1
3
+ Version: 0.9.4
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@triasoftware.com.br
@@ -134,11 +134,11 @@ O módulo principal do rpa-suite é dividido em categorias. Cada categoria cont
134
134
  - **waiter** - Funções para aguardar em relação a execução de uma função, podendo ser antes ou depois
135
135
  - **exec_at** - Funções para executar em momentos pré determinados
136
136
  - **date**
137
- - **date** - Funções para capturar data, mes, ano, hora, minutos de forma individual em apenas uma linha
137
+ - **date** - Funções para capturar data, mês, ano, hora, minutos de forma individual em apenas uma linha
138
138
  - **email**
139
139
  - **sender_smtp** - Funções para envio de email SMPT
140
140
  - **file**
141
- - **counter** - Funções para contagens
141
+ - **counter** - Funções para contagem de arquivos
142
142
  - **temp_dir** - Funções para diretórios temporários
143
143
  - **log**
144
144
  - **loggin** - Funções decoradoras com log de execução das funções
@@ -150,7 +150,7 @@ O módulo principal do rpa-suite é dividido em categorias. Cada categoria cont
150
150
  - **string_validator** - Funções para validação/varredura (strings, substrings, palavras)
151
151
 
152
152
  ## Release
153
- Versão: **Alpha 0.9.1**
153
+ Versão: **Alpha 0.9.4**
154
154
 
155
155
  Lançamento: *20/02/2024*
156
156
 
@@ -0,0 +1,26 @@
1
+ rpa_suite/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ rpa_suite/suite.py,sha256=iv4czjCTx_qWWn6fm3GrXs-4QLbI20SjbKInOqIJu7k,3261
3
+ rpa_suite/clock/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ rpa_suite/clock/exec_at.py,sha256=AIwgot-zhAgLVSuBOEIIirH4hGoF2yGPOHsMXKZLeDQ,5809
5
+ rpa_suite/clock/scheduler.py,sha256=N3JMu_nDB2xyWxTL4EGsA-_u0r1nUmwC9SnJTz0Frns,1178
6
+ rpa_suite/clock/waiter.py,sha256=hczvBR9f63ofR8FZbWO-p96yJgu-df8fm_bpfmliMZc,5900
7
+ rpa_suite/date/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ rpa_suite/date/date.py,sha256=FXdth3CLvg57T8dZApLEftJhfi2KrOev0dOvI-xVkmc,4302
9
+ rpa_suite/email/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ rpa_suite/email/sender_smtp.py,sha256=8v-IH2Z_tS0fwo-JW_ichoyX54-ekBkCRuCEyjWdFTs,7577
11
+ rpa_suite/file/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ rpa_suite/file/counter.py,sha256=DDxeMaXI1pp31-divf30BEJ3QcLnA9ucKE-D0ZpsmFU,2466
13
+ rpa_suite/file/temp_dir.py,sha256=F2ZDFLpqHO1BTtJURkiuexQNaO-pngJkk6cvTmp0JSk,7116
14
+ rpa_suite/log/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ rpa_suite/log/loggin.py,sha256=Tz2H4poc9fmib0vxb217GG8o7NhPwL_T0HLoJjbyXQs,1339
16
+ rpa_suite/log/printer.py,sha256=sykxCpOyiMe539iXuRq-yN6HpKi1xxWiP7mZ1s8mF6k,3948
17
+ rpa_suite/regex/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ rpa_suite/regex/list_from_text.py,sha256=gGTNJdnmD1kwJ6oQOMwcEFFKb_U5i4rV-bSCHC-LlKQ,2202
19
+ rpa_suite/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ rpa_suite/validate/mail_validator.py,sha256=PEa_-bON7BYnpaz-p5aEZkpza7qsoBBFKv6GwsjdjCU,2906
21
+ rpa_suite/validate/string_validator.py,sha256=7eJVTCmzVwgM513NqAAjqvo9iqHmsWQ-6LQ8-oOh_0s,5344
22
+ rpa_suite-0.9.4.dist-info/LICENSE,sha256=5D8PIbs31iGd9i1_MDNg4SzaQnp9sEIULALh2y3WyMI,1102
23
+ rpa_suite-0.9.4.dist-info/METADATA,sha256=8jJRfvuQjEwIZn9XIuVdjzi5aIuskZ_EvsekgOniMtM,6611
24
+ rpa_suite-0.9.4.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
25
+ rpa_suite-0.9.4.dist-info/top_level.txt,sha256=HYkDtg-kJNAr3F2XAIPyJ-QBbNhk7q6jrqsFt10lz4Y,10
26
+ rpa_suite-0.9.4.dist-info/RECORD,,
@@ -1,25 +0,0 @@
1
- rpa_suite/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- rpa_suite/suite.py,sha256=59U9Xk1OLQuQrx59lRtmZKy-bjFdrRaFempEyQjTsEA,3059
3
- rpa_suite/clock/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- rpa_suite/clock/exec_at.py,sha256=Se10YYKLHjYsqMHuxdxwY6YoB4Aqri1kAnbMGAf6BjM,5376
5
- rpa_suite/clock/waiter.py,sha256=ogFTQkBNGAB_K013155PtySXpuMszTsrrTz0p56Yaxg,5878
6
- rpa_suite/date/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- rpa_suite/date/date.py,sha256=0-YsoCTnMY9NdVV8oZBEZ8AtpkE21cwqi7WjZhhN6fg,4133
8
- rpa_suite/email/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- rpa_suite/email/sender_smtp.py,sha256=FIeNwLe3ZizMjyVNqeFyELBmdkZ2voQJWrDnmRm-B3A,7552
10
- rpa_suite/file/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- rpa_suite/file/counter.py,sha256=Kh0qK0Ew9nZkxCSnIeT-ia2MGZ4sEoMqnBgCq6uPqZY,2485
12
- rpa_suite/file/temp_dir.py,sha256=JqpkCMlXGwSbgUh76WjxymrPjNbVrAL-TKf6r3b8WUE,6649
13
- rpa_suite/log/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- rpa_suite/log/loggin.py,sha256=sJCkKXZPsjhLJz7gKAmLQuMcvQkefvBlVl3nlhxVUXA,1343
15
- rpa_suite/log/printer.py,sha256=P3chs13qBnd7tvZEJSCQ39Kj8wZ2BmYNHOTJm3Unf6M,4073
16
- rpa_suite/regex/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- rpa_suite/regex/list_from_text.py,sha256=0wiTA1oEQO00OfT1l7ugiT9teVo_RlU65MmcHeeKeYo,2233
18
- rpa_suite/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- rpa_suite/validate/mail_validator.py,sha256=PEa_-bON7BYnpaz-p5aEZkpza7qsoBBFKv6GwsjdjCU,2906
20
- rpa_suite/validate/string_validator.py,sha256=7eJVTCmzVwgM513NqAAjqvo9iqHmsWQ-6LQ8-oOh_0s,5344
21
- rpa_suite-0.9.1.dist-info/LICENSE,sha256=5D8PIbs31iGd9i1_MDNg4SzaQnp9sEIULALh2y3WyMI,1102
22
- rpa_suite-0.9.1.dist-info/METADATA,sha256=816ipJshuHXN_09Gxbd41OwQFaJCaEAXRN33frgK3_g,6599
23
- rpa_suite-0.9.1.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
24
- rpa_suite-0.9.1.dist-info/top_level.txt,sha256=HYkDtg-kJNAr3F2XAIPyJ-QBbNhk7q6jrqsFt10lz4Y,10
25
- rpa_suite-0.9.1.dist-info/RECORD,,