csc-cia-stne 0.0.33__py3-none-any.whl → 0.0.35__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.
- csc_cia_stne/__init__.py +22 -6
- csc_cia_stne/bc_correios.py +13 -0
- csc_cia_stne/bc_sta.py +118 -1
- csc_cia_stne/email.py +97 -0
- csc_cia_stne/google_drive.py +49 -22
- csc_cia_stne/karavela.py +20 -8
- csc_cia_stne/logger_rich.py +7 -0
- csc_cia_stne/provio.py +39 -5
- csc_cia_stne/stne_admin.py +174 -0
- csc_cia_stne/utilitarios/__init__.py +1 -1
- csc_cia_stne/utilitarios/functions/__init__.py +2 -1
- csc_cia_stne/utilitarios/functions/func_recriar_pastas.py +10 -0
- csc_cia_stne/utilitarios/functions/func_settings.py +62 -0
- csc_cia_stne/utilitarios/functions/func_titulo.py +38 -1
- csc_cia_stne/utilitarios/validations/GcpBigQueryValidator.py +43 -1
- csc_cia_stne/utilitarios/validations/GoogleDriveValidator.py +82 -3
- csc_cia_stne/utilitarios/validations/ServiceNowValidator.py +210 -7
- {csc_cia_stne-0.0.33.dist-info → csc_cia_stne-0.0.35.dist-info}/METADATA +2 -1
- csc_cia_stne-0.0.35.dist-info/RECORD +28 -0
- csc_cia_stne-0.0.33.dist-info/RECORD +0 -27
- {csc_cia_stne-0.0.33.dist-info → csc_cia_stne-0.0.35.dist-info}/LICENCE +0 -0
- {csc_cia_stne-0.0.33.dist-info → csc_cia_stne-0.0.35.dist-info}/WHEEL +0 -0
- {csc_cia_stne-0.0.33.dist-info → csc_cia_stne-0.0.35.dist-info}/top_level.txt +0 -0
csc_cia_stne/__init__.py
CHANGED
@@ -13,7 +13,7 @@ from .provio import Provio
|
|
13
13
|
|
14
14
|
# Define os itens disponíveis para importação
|
15
15
|
__all__ = [
|
16
|
-
"
|
16
|
+
"Karavela",
|
17
17
|
"BigQuery",
|
18
18
|
"BC_Correios",
|
19
19
|
"BC_STA",
|
@@ -25,14 +25,18 @@ __all__ = [
|
|
25
25
|
"Email"
|
26
26
|
]
|
27
27
|
|
28
|
-
|
29
|
-
|
28
|
+
_diretorio_inicial = os.getcwd()
|
29
|
+
_caminho_env = os.path.join(_diretorio_inicial, ".env")
|
30
30
|
|
31
31
|
# Carrega .env
|
32
|
-
load_dotenv(
|
32
|
+
load_dotenv(_caminho_env)
|
33
33
|
logger = None # Inicializa como None
|
34
34
|
|
35
|
-
def
|
35
|
+
def _running_in_container():
|
36
|
+
"""
|
37
|
+
Verifica se o código está sendo executado dentro de um container.
|
38
|
+
Retorna True se estiver sendo executado dentro de um container e False caso contrário.
|
39
|
+
"""
|
36
40
|
|
37
41
|
if os.environ.get("KUBERNETES_SERVICE_HOST") or os.path.exists("/.dockerenv"):
|
38
42
|
|
@@ -55,12 +59,24 @@ def running_in_container():
|
|
55
59
|
return False
|
56
60
|
|
57
61
|
def logger():
|
62
|
+
"""
|
63
|
+
Retorna um objeto logger com base no ambiente de execução.
|
64
|
+
Se a variável de ambiente 'ambiente_de_execucao' estiver definida e for igual a "karavela",
|
65
|
+
retorna um logger formatado em JSON usando a função get_logger_json().
|
66
|
+
Caso contrário, se estiver executando em um container, retorna um logger formatado em JSON
|
67
|
+
usando a função get_logger_json().
|
68
|
+
Caso contrário, retorna um logger formatado em texto usando a função get_logger_rich().
|
69
|
+
Exemplo de uso:
|
70
|
+
logger_obj = logger()
|
71
|
+
logger_obj.info("Mensagem de informação")
|
72
|
+
logger_obj.error("Mensagem de erro")
|
73
|
+
"""
|
58
74
|
|
59
75
|
if os.getenv('ambiente_de_execucao') is not None and os.getenv('ambiente_de_execucao') == "karavela":
|
60
76
|
|
61
77
|
return get_logger_json()
|
62
78
|
|
63
|
-
elif
|
79
|
+
elif _running_in_container():
|
64
80
|
|
65
81
|
return get_logger_json()
|
66
82
|
|
csc_cia_stne/bc_correios.py
CHANGED
@@ -60,6 +60,19 @@ class AnexoDict(BaseModel):
|
|
60
60
|
class BC_Correios:
|
61
61
|
|
62
62
|
def __init__(self, wsdl_url:str, usuario:str, senha:str, correios_por_pasta_pasta_unidade_nome:str='40797', correios_por_pasta_pasta_unidade_ativa:bool=True, correios_por_pasta_pasta_unidade_tipo:str='InstituicaoFinanceira', correios_por_pasta_pasta_tipo:str='CaixaEntrada',correios_por_pasta_apenas_mensagens:bool=True, correios_por_pasta_pesquisar_em_todas_as_pastas:bool=True):
|
63
|
+
"""
|
64
|
+
Inicializa a classe BC_Correios.
|
65
|
+
Parâmetros:
|
66
|
+
- wsdl_url (str): URL do WSDL do serviço dos Correios.
|
67
|
+
- usuario (str): Nome de usuário para autenticação no serviço dos Correios.
|
68
|
+
- senha (str): Senha para autenticação no serviço dos Correios.
|
69
|
+
- correios_por_pasta_pasta_unidade_nome (str, opcional): Nome da unidade da pasta dos Correios. Valor padrão é '40797'.
|
70
|
+
- correios_por_pasta_pasta_unidade_ativa (bool, opcional): Indica se a unidade da pasta dos Correios está ativa. Valor padrão é True.
|
71
|
+
- correios_por_pasta_pasta_unidade_tipo (str, opcional): Tipo da unidade da pasta dos Correios. Valor padrão é 'InstituicaoFinanceira'.
|
72
|
+
- correios_por_pasta_pasta_tipo (str, opcional): Tipo da pasta dos Correios. Valor padrão é 'CaixaEntrada'.
|
73
|
+
- correios_por_pasta_apenas_mensagens (bool, opcional): Indica se deve retornar apenas mensagens da pasta dos Correios. Valor padrão é True.
|
74
|
+
- correios_por_pasta_pesquisar_em_todas_as_pastas (bool, opcional): Indica se deve pesquisar em todas as pastas dos Correios. Valor padrão é True.
|
75
|
+
"""
|
63
76
|
|
64
77
|
try:
|
65
78
|
|
csc_cia_stne/bc_sta.py
CHANGED
@@ -7,11 +7,31 @@ from typing import Literal, Dict, Union, Optional
|
|
7
7
|
|
8
8
|
# Validações dos inputs
|
9
9
|
class InitParamsValidator(BaseModel):
|
10
|
+
"""
|
11
|
+
Classe responsável por validar os parâmetros de inicialização.
|
12
|
+
Atributos:
|
13
|
+
usuario (str): O nome de usuário.
|
14
|
+
senha (str): A senha do usuário.
|
15
|
+
ambiente (Literal["prd", "hml"]): O ambiente, que pode ser "prd" (produção) ou "hml" (homologação).
|
16
|
+
Métodos:
|
17
|
+
check_non_empty_string(value, info): Método de validação para garantir que cada parâmetro é uma string não vazia.
|
18
|
+
"""
|
19
|
+
|
10
20
|
usuario: str
|
11
21
|
senha: str
|
12
22
|
ambiente: Literal["prd", "hml"] # Aceita apenas "prd" ou "sdx"
|
13
23
|
|
14
24
|
# Validação para garantir que cada parâmetro é uma string não vazia
|
25
|
+
"""
|
26
|
+
Método de validação para garantir que cada parâmetro é uma string não vazia.
|
27
|
+
Parâmetros:
|
28
|
+
value (Any): O valor do parâmetro a ser validado.
|
29
|
+
info (FieldInfo): As informações do campo a ser validado.
|
30
|
+
Retorna:
|
31
|
+
value (Any): O valor do parâmetro validado.
|
32
|
+
Lança:
|
33
|
+
ValueError: Se o valor do parâmetro não for uma string não vazia.
|
34
|
+
"""
|
15
35
|
@field_validator('usuario', 'senha')
|
16
36
|
def check_non_empty_string(cls, value, info):
|
17
37
|
if not isinstance(value, str) or not value.strip():
|
@@ -21,6 +41,23 @@ class InitParamsValidator(BaseModel):
|
|
21
41
|
return value
|
22
42
|
|
23
43
|
class EnviarArquivoValidator(BaseModel):
|
44
|
+
"""
|
45
|
+
Classe responsável por validar os parâmetros de envio de arquivo.
|
46
|
+
Args:
|
47
|
+
tipo_arquivo (str): O código do tipo de envio a ser utilizado para o STA.
|
48
|
+
Verificar códigos disponíveis na documentação STA.
|
49
|
+
file_content (bytes): O conteúdo do arquivo a ser enviado, em formato de bytes.
|
50
|
+
nome_arquivo (str): O nome do arquivo a ser enviado.
|
51
|
+
Deve ser uma string não vazia e terminar com uma extensão de arquivo comum.
|
52
|
+
observacao (str): A observação relacionada ao envio do arquivo.
|
53
|
+
Deve ser uma string não vazia.
|
54
|
+
destinatarios (Optional[Union[Dict[str, str], str]], optional): Os destinatários do arquivo.
|
55
|
+
Pode ser um dicionário ou uma string XML. Defaults to None.
|
56
|
+
Raises:
|
57
|
+
ValueError: Se algum dos parâmetros não atender às condições de validação.
|
58
|
+
Returns:
|
59
|
+
O valor de cada parâmetro, se a validação for bem-sucedida.
|
60
|
+
"""
|
24
61
|
tipo_arquivo:str
|
25
62
|
file_content:bytes
|
26
63
|
nome_arquivo:str
|
@@ -85,6 +122,19 @@ class EnviarArquivoValidator(BaseModel):
|
|
85
122
|
class BC_STA:
|
86
123
|
|
87
124
|
def __init__(self, usuario:str, senha:str, ambiente:str):
|
125
|
+
"""
|
126
|
+
Inicializa uma instância da classe BC_STA.
|
127
|
+
Parâmetros:
|
128
|
+
- usuario (str): O nome de usuário para autenticação.
|
129
|
+
- senha (str): A senha para autenticação.
|
130
|
+
- ambiente (str): O ambiente de execução ('prd' para produção ou qualquer outro valor para ambiente de teste).
|
131
|
+
Raises:
|
132
|
+
- ValueError: Se houver erro na validação dos dados de input da inicialização da instância 'BC_STA'.
|
133
|
+
Exemplo de uso:
|
134
|
+
```
|
135
|
+
bc_sta = BC_STA(usuario='meu_usuario', senha='minha_senha', ambiente='prd')
|
136
|
+
```
|
137
|
+
"""
|
88
138
|
|
89
139
|
try:
|
90
140
|
|
@@ -115,6 +165,18 @@ class BC_STA:
|
|
115
165
|
self.error = e
|
116
166
|
|
117
167
|
def verifica_conexao(self):
|
168
|
+
"""
|
169
|
+
Verifica a conexão com o servidor STA do Banco Central do Brasil.
|
170
|
+
Returns:
|
171
|
+
bool: True se a conexão for bem-sucedida, False caso contrário.
|
172
|
+
Raises:
|
173
|
+
Exception: Se ocorrer algum erro durante a verificação da conexão.
|
174
|
+
Example:
|
175
|
+
# Criando uma instância da classe
|
176
|
+
bc_sta = BCSTA()
|
177
|
+
# Verificando a conexão
|
178
|
+
conexao = bc_sta.verifica_conexao()
|
179
|
+
"""
|
118
180
|
try:
|
119
181
|
|
120
182
|
response = requests.get("https://sta.bcb.gov.br/staws/arquivos?tipoConsulta=AVANC&nivelDetalhe=RES", auth=self.auth)
|
@@ -134,7 +196,34 @@ class BC_STA:
|
|
134
196
|
raise e
|
135
197
|
|
136
198
|
def enviar_arquivo(self, tipo_arquivo:str, file_content:bytes, nome_arquivo:str, observacao:str, destinatarios:dict=None):
|
137
|
-
|
199
|
+
"""
|
200
|
+
Envia um arquivo para um determinado destino.
|
201
|
+
tipo_arquivo (str): O tipo de arquivo a ser enviado.
|
202
|
+
nome_arquivo (str): O nome do arquivo.
|
203
|
+
observacao (str): Uma observação opcional.
|
204
|
+
destinatarios (dict, optional): Um dicionário contendo informações sobre os destinatários do arquivo.
|
205
|
+
O dicionário deve ter a seguinte estrutura:
|
206
|
+
{
|
207
|
+
'unidade': 'nome_da_unidade',
|
208
|
+
'dependencia': 'nome_da_dependencia', # opcional
|
209
|
+
'operador': 'nome_do_operador' # opcional
|
210
|
+
O campo 'dependencia' e 'operador' são opcionais.
|
211
|
+
- 'enviado': Um valor booleano indicando se o arquivo foi enviado com sucesso.
|
212
|
+
- 'protocolo': O protocolo gerado, caso o arquivo tenha sido enviado com sucesso.
|
213
|
+
- 'link': O link do arquivo, caso tenha sido enviado com sucesso.
|
214
|
+
- 'erro': Uma mensagem de erro, caso ocorra algum problema no envio do arquivo.
|
215
|
+
ValueError: Se ocorrer um erro na validação dos dados de entrada.
|
216
|
+
Exception: Se ocorrer um erro durante o envio do arquivo.
|
217
|
+
# Exemplo de chamada da função
|
218
|
+
tipo_arquivo = 'documento'
|
219
|
+
nome_arquivo = 'arquivo.txt'
|
220
|
+
observacao = 'Este é um arquivo de teste'
|
221
|
+
destinatarios = {
|
222
|
+
'unidade': 'unidade_destino',
|
223
|
+
'dependencia': 'dependencia_destino',
|
224
|
+
'operador': 'operador_destino'
|
225
|
+
resposta = enviar_arquivo(tipo_arquivo, file_content, nome_arquivo, observacao, destinatarios)
|
226
|
+
"""
|
138
227
|
try:
|
139
228
|
|
140
229
|
EnviarArquivoValidator(tipo_arquivo=tipo_arquivo, file_content=file_content, nome_arquivo=nome_arquivo, observacao=observacao, destinatarios=destinatarios)
|
@@ -144,6 +233,17 @@ class BC_STA:
|
|
144
233
|
raise ValueError("Erro na validação dos dados de input do método 'enviar_arquivo':", e.errors())
|
145
234
|
|
146
235
|
def generate_sha256_hash(file_content):
|
236
|
+
"""
|
237
|
+
Gera o hash SHA-256 do conteúdo de um arquivo.
|
238
|
+
Args:
|
239
|
+
file_content (bytes): O conteúdo do arquivo como uma sequência de bytes.
|
240
|
+
Returns:
|
241
|
+
str: O hash SHA-256 do conteúdo do arquivo.
|
242
|
+
Example:
|
243
|
+
file_content = b'Lorem ipsum dolor sit amet'
|
244
|
+
hash_value = generate_sha256_hash(file_content)
|
245
|
+
print(hash_value)
|
246
|
+
"""
|
147
247
|
|
148
248
|
# Gera o hash SHA-256 do arquivo
|
149
249
|
sha256_hash = hashlib.sha256()
|
@@ -151,6 +251,23 @@ class BC_STA:
|
|
151
251
|
return sha256_hash.hexdigest()
|
152
252
|
|
153
253
|
def process_response(xml_content):
|
254
|
+
"""
|
255
|
+
Processa o conteúdo XML de resposta e retorna um dicionário com as informações relevantes.
|
256
|
+
Args:
|
257
|
+
xml_content (str): O conteúdo XML de resposta.
|
258
|
+
Returns:
|
259
|
+
dict: Um dicionário contendo as seguintes chaves:
|
260
|
+
- 'enviado': Um valor booleano indicando se o XML foi enviado com sucesso.
|
261
|
+
- 'protocolo': O protocolo extraído do XML, caso tenha sido enviado com sucesso.
|
262
|
+
- 'link': O link extraído do XML, caso tenha sido enviado com sucesso.
|
263
|
+
- 'erro': Uma mensagem de erro, caso ocorra algum problema no processamento do XML.
|
264
|
+
Raises:
|
265
|
+
None
|
266
|
+
Exemplo de uso:
|
267
|
+
xml = "<root>...</root>"
|
268
|
+
resposta = process_response(xml)
|
269
|
+
print(resposta)
|
270
|
+
"""
|
154
271
|
|
155
272
|
try:
|
156
273
|
|
csc_cia_stne/email.py
CHANGED
@@ -6,9 +6,27 @@ from email import encoders
|
|
6
6
|
from pydantic import BaseModel, ValidationError, field_validator
|
7
7
|
|
8
8
|
class InitParamsValidator(BaseModel):
|
9
|
+
"""
|
10
|
+
Classe para validar os parâmetros de inicialização.
|
11
|
+
Atributos:
|
12
|
+
- email_sender (str): O endereço de e-mail do remetente.
|
13
|
+
- email_password (str): A senha do e-mail.
|
14
|
+
Métodos:
|
15
|
+
- check_str_input(value, info): Valida se o valor é uma string não vazia.
|
16
|
+
"""
|
9
17
|
email_sender: str
|
10
18
|
email_password: str
|
11
19
|
|
20
|
+
"""
|
21
|
+
Valida se o valor é uma string não vazia.
|
22
|
+
Parâmetros:
|
23
|
+
- value: O valor a ser validado.
|
24
|
+
- info: Informações sobre o campo.
|
25
|
+
Retorna:
|
26
|
+
- value: O valor validado.
|
27
|
+
Lança:
|
28
|
+
- ValueError: Se o valor não for uma string ou estiver vazio.
|
29
|
+
"""
|
12
30
|
@field_validator('email_sender','email_password')
|
13
31
|
def check_str_input(cls, value, info):
|
14
32
|
if not isinstance(value, str) or not value.strip():
|
@@ -16,6 +34,17 @@ class InitParamsValidator(BaseModel):
|
|
16
34
|
return value
|
17
35
|
|
18
36
|
class SendEmailParamsValidator(BaseModel):
|
37
|
+
"""
|
38
|
+
Classe para validar os parâmetros de envio de e-mail.
|
39
|
+
Atributos:
|
40
|
+
- to (list): Lista de destinatários do e-mail.
|
41
|
+
- message (str): Mensagem do e-mail.
|
42
|
+
- title (str): Título do e-mail.
|
43
|
+
- reply_to (str): Endereço de e-mail para resposta.
|
44
|
+
- attachments (list, opcional): Lista de anexos do e-mail.
|
45
|
+
- cc (list, opcional): Lista de destinatários em cópia do e-mail.
|
46
|
+
- cco (list, opcional): Lista de destinatários em cópia oculta do e-mail.
|
47
|
+
"""
|
19
48
|
|
20
49
|
to: list
|
21
50
|
message: str
|
@@ -25,12 +54,32 @@ class SendEmailParamsValidator(BaseModel):
|
|
25
54
|
cc: list = []
|
26
55
|
cco: list = []
|
27
56
|
|
57
|
+
"""
|
58
|
+
Valida se o valor é uma string não vazia.
|
59
|
+
Parâmetros:
|
60
|
+
- value (str): Valor a ser validado.
|
61
|
+
- info (FieldInfo): Informações sobre o campo.
|
62
|
+
Retorna:
|
63
|
+
- str: O valor validado.
|
64
|
+
Lança:
|
65
|
+
- ValueError: Se o valor não for uma string ou estiver vazio.
|
66
|
+
"""
|
28
67
|
@field_validator('message','title','reply_to')
|
29
68
|
def check_str_input(cls, value, info):
|
30
69
|
if not isinstance(value, str) or not value.strip():
|
31
70
|
raise ValueError(f"O campo '{info.field_name}' deve ser strings e não {type(value)}")
|
32
71
|
return value
|
33
72
|
|
73
|
+
"""
|
74
|
+
Valida se o valor é uma lista.
|
75
|
+
Parâmetros:
|
76
|
+
- value (list): Valor a ser validado.
|
77
|
+
- info (FieldInfo): Informações sobre o campo.
|
78
|
+
Retorna:
|
79
|
+
- list: O valor validado.
|
80
|
+
Lança:
|
81
|
+
- ValueError: Se o valor não for uma lista.
|
82
|
+
"""
|
34
83
|
@field_validator('to','attachments','cc','cco')
|
35
84
|
def check_list_input(cls, value, info):
|
36
85
|
if not isinstance(value, list):
|
@@ -41,6 +90,16 @@ class SendEmailParamsValidator(BaseModel):
|
|
41
90
|
class Email():
|
42
91
|
|
43
92
|
def __init__(self, email_sender, email_password):
|
93
|
+
"""
|
94
|
+
Inicializa uma instância da classe Email.
|
95
|
+
Args:
|
96
|
+
email_sender (str): O endereço de e-mail do remetente.
|
97
|
+
email_password (str): A senha do e-mail do remetente.
|
98
|
+
Raises:
|
99
|
+
ValueError: Se houver um erro na validação dos dados de entrada da inicialização da instância.
|
100
|
+
Returns:
|
101
|
+
None
|
102
|
+
"""
|
44
103
|
|
45
104
|
self.email_sender = email_sender
|
46
105
|
self.email_password = email_password
|
@@ -62,6 +121,18 @@ class Email():
|
|
62
121
|
|
63
122
|
|
64
123
|
def login_email(self):
|
124
|
+
"""
|
125
|
+
Realiza o login no servidor de e-mail.
|
126
|
+
Returns:
|
127
|
+
smtplib.SMTP: Objeto que representa a conexão com o servidor de e-mail.
|
128
|
+
Raises:
|
129
|
+
dict: Dicionário contendo o status de erro caso ocorra uma exceção durante o login.
|
130
|
+
Example:
|
131
|
+
email_sender = 'seu_email@gmail.com'
|
132
|
+
email_password = 'sua_senha'
|
133
|
+
email = Email(email_sender, email_password)
|
134
|
+
server = email.login_email()
|
135
|
+
"""
|
65
136
|
|
66
137
|
try:
|
67
138
|
|
@@ -80,6 +151,32 @@ class Email():
|
|
80
151
|
|
81
152
|
|
82
153
|
def send_email( self, to : list , message : str , title : str , reply_to: str, attachments : list = [] , cc : list = [] , cco : list = [] ) -> dict:
|
154
|
+
"""
|
155
|
+
Envia um email com os parâmetros fornecidos.
|
156
|
+
Args:
|
157
|
+
to (list): Lista de destinatários do email.
|
158
|
+
message (str): Corpo do email.
|
159
|
+
title (str): Título do email.
|
160
|
+
reply_to (str): Endereço de email para resposta.
|
161
|
+
attachments (list, optional): Lista de caminhos dos arquivos anexos. Defaults to [].
|
162
|
+
cc (list, optional): Lista de destinatários em cópia. Defaults to [].
|
163
|
+
cco (list, optional): Lista de destinatários em cópia oculta. Defaults to [].
|
164
|
+
Returns:
|
165
|
+
dict: Dicionário com o status do envio do email. Se o envio for bem-sucedido, o dicionário terá a chave 'status' com valor True. Caso contrário, terá a chave 'status' com valor False e a chave 'error' com a descrição do erro.
|
166
|
+
Raises:
|
167
|
+
ValueError: Se houver erro na validação dos dados para o envio do email.
|
168
|
+
Example:
|
169
|
+
email = EmailSender()
|
170
|
+
to = ['example1@example.com', 'example2@example.com']
|
171
|
+
message = 'Olá, isso é um teste de email.'
|
172
|
+
title = 'Teste de Email'
|
173
|
+
reply_to = 'noreply@example.com'
|
174
|
+
attachments = ['/path/to/file1.txt', '/path/to/file2.txt']
|
175
|
+
cc = ['cc1@example.com', 'cc2@example.com']
|
176
|
+
cco = ['cco1@example.com', 'cco2@example.com']
|
177
|
+
result = email.send_email(to, message, title, reply_to, attachments, cc, cco)
|
178
|
+
print(result)
|
179
|
+
"""
|
83
180
|
|
84
181
|
try:
|
85
182
|
|
csc_cia_stne/google_drive.py
CHANGED
@@ -23,11 +23,21 @@ class GoogleDrive():
|
|
23
23
|
|
24
24
|
def __init__(self, key, with_subject : str, scopes : list = ["https://www.googleapis.com/auth/drive"], version : str = "v3"):
|
25
25
|
"""
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
Inicializa uma instância da classe GoogleDrive.
|
27
|
+
Parâmetros:
|
28
|
+
- key (str): A chave para acessar o segredo necessário para autenticação.
|
29
|
+
- with_subject (str): O assunto para o qual a autenticação será realizada.
|
30
|
+
- scopes (list): Uma lista de escopos de permissão para acesso ao Google Drive. O valor padrão é ["https://www.googleapis.com/auth/drive"].
|
31
|
+
- version (str): A versão da API do Google Drive a ser utilizada. O valor padrão é "v3".
|
32
|
+
Raises:
|
33
|
+
- ValueError: Se ocorrer um erro na validação dos dados de input da inicialização da instância.
|
34
|
+
Exemplo de uso:
|
35
|
+
```
|
36
|
+
google_drive = GoogleDrive(key="chave_secreta", with_subject="assunto", scopes=["https://www.googleapis.com/auth/drive"], version="v3")
|
37
|
+
```
|
30
38
|
"""
|
39
|
+
# código de inicialização da instância
|
40
|
+
|
31
41
|
try:
|
32
42
|
InitParamsValidator(key=key, with_subject=with_subject, scopes=scopes)
|
33
43
|
except ValidationError as e:
|
@@ -42,8 +52,18 @@ class GoogleDrive():
|
|
42
52
|
|
43
53
|
def timer_decorator(func):
|
44
54
|
"""
|
45
|
-
|
55
|
+
Decorator que calcula o tempo de execução de uma função.
|
56
|
+
Args:
|
57
|
+
func: A função a ser decorada.
|
58
|
+
Returns:
|
59
|
+
A função decorada.
|
60
|
+
Exemplo de uso:
|
61
|
+
@timer_decorator
|
62
|
+
def minha_funcao():
|
63
|
+
# código da função
|
64
|
+
minha_funcao()
|
46
65
|
"""
|
66
|
+
|
47
67
|
def wrapper(*args, **kwargs):
|
48
68
|
inicio = time.time()
|
49
69
|
resultado = func(*args, **kwargs)
|
@@ -54,15 +74,20 @@ class GoogleDrive():
|
|
54
74
|
|
55
75
|
def create_service(self):
|
56
76
|
"""
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
77
|
+
Cria um serviço do Google Drive.
|
78
|
+
Returns:
|
79
|
+
cred: Objeto de credenciais do Google Drive.
|
80
|
+
False: Caso ocorra algum erro ao criar o serviço.
|
81
|
+
Raises:
|
82
|
+
Exception: Caso ocorra algum erro ao criar o serviço do Google Drive.
|
83
|
+
Exemplo de uso:
|
84
|
+
service = create_service()
|
85
|
+
if service:
|
86
|
+
# Fazer algo com o serviço do Google Drive
|
87
|
+
else:
|
88
|
+
# Tratar o erro de criação do serviço
|
65
89
|
"""
|
90
|
+
|
66
91
|
try:
|
67
92
|
|
68
93
|
cred = build(f"drive", f"{self.version}", credentials=self.__auth)
|
@@ -74,16 +99,18 @@ class GoogleDrive():
|
|
74
99
|
|
75
100
|
def __autentica(self, with_subject : str):
|
76
101
|
"""
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
102
|
+
Autentica o usuário com as credenciais fornecidas e retorna as credenciais delegadas para o assunto especificado.
|
103
|
+
Args:
|
104
|
+
with_subject (str): O assunto para o qual as credenciais serão delegadas.
|
105
|
+
Returns:
|
106
|
+
google.auth.credentials.Credentials: As credenciais delegadas para o assunto especificado.
|
107
|
+
Raises:
|
108
|
+
Exception: Se ocorrer um erro durante a autenticação.
|
109
|
+
Example:
|
110
|
+
# Autenticar com o assunto "user@example.com"
|
111
|
+
credentials = self.__autentica("user@example.com")
|
86
112
|
"""
|
113
|
+
|
87
114
|
|
88
115
|
try:
|
89
116
|
credentials = service_account.Credentials.from_service_account_info(self.__token, scopes=self.scopes)
|
csc_cia_stne/karavela.py
CHANGED
@@ -9,14 +9,22 @@ class Karavela():
|
|
9
9
|
self.healthy_check_file = None
|
10
10
|
|
11
11
|
def create_health_check_file(self,health_check_filename:str = None)->bool:
|
12
|
-
"""
|
13
|
-
|
12
|
+
"""
|
13
|
+
Cria um arquivo de verificação de saúde.
|
14
14
|
Args:
|
15
|
-
|
15
|
+
health_check_filename (str, optional): O nome do arquivo de verificação de saúde.
|
16
|
+
Se não for fornecido, um ValueError será levantado.
|
16
17
|
Returns:
|
17
|
-
bool: True
|
18
|
+
bool: True se o arquivo for criado com sucesso.
|
19
|
+
Raises:
|
20
|
+
ValueError: Se o parâmetro health_check_filename não for fornecido.
|
21
|
+
Example:
|
22
|
+
>>> karavela = Karavela()
|
23
|
+
>>> karavela.create_health_check_file("health_check.txt")
|
24
|
+
True
|
18
25
|
"""
|
19
26
|
|
27
|
+
|
20
28
|
if health_check_filename is None or health_check_filename == "":
|
21
29
|
|
22
30
|
raise ValueError("O método 'create_health_check_file' precisa do parâmetro health_check_filename especificado")
|
@@ -43,11 +51,15 @@ class Karavela():
|
|
43
51
|
raise e
|
44
52
|
|
45
53
|
def destroy_health_check_file(self)->bool:
|
46
|
-
"""Deleta o arquivo de health check
|
47
|
-
|
48
|
-
Returns:
|
49
|
-
bool: True
|
50
54
|
"""
|
55
|
+
Remove o arquivo de verificação de saúde.
|
56
|
+
Retorna:
|
57
|
+
bool: True se o arquivo foi removido com sucesso, False caso contrário.
|
58
|
+
Raises:
|
59
|
+
ValueError: Se o método 'create_health_check_file' não foi executado antes.
|
60
|
+
Exception: Se ocorrer algum erro durante a remoção do arquivo.
|
61
|
+
"""
|
62
|
+
|
51
63
|
|
52
64
|
if self.health_check_filename is None:
|
53
65
|
|
csc_cia_stne/logger_rich.py
CHANGED
@@ -116,6 +116,13 @@ logger = logging.getLogger()
|
|
116
116
|
"""
|
117
117
|
|
118
118
|
def get_logger():
|
119
|
+
"""
|
120
|
+
Retorna um objeto logger configurado com base nas variáveis de ambiente.
|
121
|
+
Returns:
|
122
|
+
logging.Logger: Objeto logger configurado.
|
123
|
+
Raises:
|
124
|
+
ValueError: Se o valor da variável de ambiente 'log_level' não for 'DEBUG', 'INFO', 'WARNING', 'ERROR' ou 'CRITICAL'.
|
125
|
+
"""
|
119
126
|
# Instala formatações de exception da biblioteca Rich
|
120
127
|
install()
|
121
128
|
|
csc_cia_stne/provio.py
CHANGED
@@ -2,29 +2,63 @@ import logging
|
|
2
2
|
import requests
|
3
3
|
from requests.auth import HTTPBasicAuth
|
4
4
|
from pydantic import BaseModel, Field, ValidationError
|
5
|
+
from typing import List, Dict, Union
|
5
6
|
|
6
7
|
# Validadores
|
7
8
|
class ProvioModel(BaseModel):
|
9
|
+
"""
|
10
|
+
Modelo para validação das credenciais de autenticação.
|
11
|
+
"""
|
8
12
|
username: str = Field(..., strip_whitespace=True, min_length=1)
|
9
13
|
password: str = Field(..., strip_whitespace=True, min_length=1)
|
10
14
|
|
11
15
|
class ExportarRelatorioParams(BaseModel):
|
16
|
+
"""
|
17
|
+
Modelo para validação dos parâmetros do relatório.
|
18
|
+
"""
|
12
19
|
ano: int = Field(..., gt=2015, description="O ano deve ser maior que 2015")
|
13
20
|
mes: int = Field(..., ge=1, le=12, description="O mês deve estar entre 1 e 12")
|
14
21
|
|
15
22
|
# Classe provio
|
16
23
|
class Provio:
|
17
|
-
|
18
|
-
|
19
|
-
|
24
|
+
"""
|
25
|
+
Classe para interagir com a API do Provio.
|
26
|
+
"""
|
27
|
+
|
28
|
+
def __init__(self, username: str, password: str):
|
29
|
+
"""
|
30
|
+
Inicializa a classe com as credenciais de autenticação.
|
31
|
+
|
32
|
+
Args:
|
33
|
+
username (str): Nome de usuário para autenticação.
|
34
|
+
password (str): Senha para autenticação.
|
35
|
+
|
36
|
+
Raises:
|
37
|
+
ValidationError: Se as credenciais forem inválidas de acordo com o modelo `ProvioModel`.
|
38
|
+
"""
|
20
39
|
# Validação usando Pydantic
|
21
40
|
data = ProvioModel(username=username, password=password)
|
22
41
|
|
23
42
|
self.api_url = "https://provio.apps.stone.com.br/api/reports"
|
24
43
|
self.auth = HTTPBasicAuth(data.username, data.password)
|
25
44
|
|
26
|
-
def exportar_relatorio_geral(self, ano:int, mes:int):
|
27
|
-
|
45
|
+
def exportar_relatorio_geral(self, ano: int, mes: int) -> Dict[str, Union[bool, str, List[Dict]]]:
|
46
|
+
"""
|
47
|
+
Exporta o relatório geral para o período especificado.
|
48
|
+
|
49
|
+
Args:
|
50
|
+
ano (int): Ano do relatório (deve ser maior que 2015).
|
51
|
+
mes (int): Mês do relatório (deve estar entre 1 e 12).
|
52
|
+
|
53
|
+
Returns:
|
54
|
+
Dict[str, Union[bool, str, List[Dict]]]: Um dicionário contendo:
|
55
|
+
- `success` (bool): Indica se a exportação foi bem-sucedida.
|
56
|
+
- `error` (str): Mensagem de erro, se houver.
|
57
|
+
- `report` (List[Dict]): Lista de registros exportados, se `success` for `True`.
|
58
|
+
|
59
|
+
Raises:
|
60
|
+
ValidationError: Se os parâmetros `ano` e `mes` forem inválidos.
|
61
|
+
"""
|
28
62
|
# Validação dos parâmetros
|
29
63
|
params = ExportarRelatorioParams(ano=ano, mes=mes)
|
30
64
|
periodo = f"{params.ano}-{params.mes:02d}"
|