lbxtoolkit 2.2.6__py3-none-any.whl → 2.2.8__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.
lbxtoolkit/api_rest.py CHANGED
@@ -166,6 +166,56 @@ Para uso em APIs com autenticação JWT (JSON Web Token), OAuth, Bearer Token Au
166
166
  return Err
167
167
  #
168
168
  #
169
+ def auth_token(self): # Autentica e abre sessão na API
170
+ if self.Credenciais['token']:
171
+ Token = self.Credenciais['token']
172
+ self.Headers.update({"UserAuthorization": f"token {Token}"})
173
+ else:
174
+ self.logger.critico(f'Falha de requisição api_rest.auth_token: Token não fornecido no dicionário de credenciais! Necessário informar chave da API em dicionário com chave "token" no instanciamento da classe', exit=1)
175
+
176
+ try:
177
+ self.Sessao = requests.Session()
178
+ Auth = self.Sessao.post(self.Url, headers=self.Headers, verify=self.Verify)
179
+
180
+ if 200 <= Auth.status_code <= 299:
181
+ self.Sessao.status_code = Auth.status_code
182
+ return self.Sessao
183
+ else:
184
+ self.logger.critico(f"Erro ao autenticar API: {self.Sessao.status_code} - {self.Sessao.text}")
185
+ raise Exception
186
+ except Exception as Err:
187
+ self.logger.critico(f"Falha ao autenticar API: {Err}. URL: {self.Url}")
188
+ return Err
189
+ #
190
+ #
191
+ def url_request(self, metodo, payload=None): # Efetua chamada diretamente à URL e não a EndPoint específico
192
+ self.ult_tempo_req = time()
193
+ self.Metodo = metodo.lower()
194
+ self.EndPoint = self.Url
195
+ self.Payload = payload
196
+ MetodosAceitos = ['post', 'get', 'patch', 'put']
197
+ if not any(element in self.Metodo for element in MetodosAceitos):
198
+ self.logger.critico(f'Método {self.Metodo} não previsto. Abortando chamada!', exit=1)
199
+ else:
200
+ ChamadaApi = f'self.Sessao.{self.Metodo}(self.Url, timeout=self.Timeout, headers=self.Headers, verify=self.Verify)' if self.Payload is None else f'self.Sessao.{self.Metodo}(self.Url, timeout=self.Timeout, headers=self.Headers, verify=self.Verify, data=self.Payload)'
201
+ self.controla_cadencia()
202
+ self.TempoUltReq = time()
203
+ try:
204
+ self.RetEndPoint = eval(ChamadaApi)
205
+ if self.RetEndPoint.status_code >= 500:
206
+ self.logger.critico(f'Erro [{self.RetEndPoint.status_code}] no lado servidor na resposta à requisição')
207
+ raise Exception
208
+ self.RetEndPoint.Espera = self.Espera ## adiona o tempo de espera ao retorno da API
209
+ self.RetEndPoint.Intervalo = self.Intervalo ## adiciona o intervalo entre chamada ao retorno da API
210
+ return self.RetEndPoint
211
+ except requests.exceptions.ReadTimeout as Err:
212
+ self.logger.critico(f'Excedido tempo limite {self.Timeout} para retorno do endpoint: {Err}\nEndpoint: {self.EndPoint}')
213
+ return Err
214
+ except Exception as Err:
215
+ self.logger.critico(f'Falha na chamada do endpoint: {Err}\nEndpoint: {self.EndPoint}\nCodigo retorno: {self.RetEndPoint.status_code}\nResposta:{self.RetEndPoint.text}')
216
+ return self.RetEndPoint
217
+ #
218
+ #
169
219
  def endpoint_json(self, endpoint, metodo, payload=None): # Interage com End Point
170
220
  self.ult_tempo_req = time()
171
221
  self.Metodo = metodo.lower()
@@ -182,7 +232,7 @@ Para uso em APIs com autenticação JWT (JSON Web Token), OAuth, Bearer Token Au
182
232
  try:
183
233
  self.RetEndPoint = eval(ChamadaApi)
184
234
  if self.RetEndPoint.status_code >= 500:
185
- self.logger.critico(f'Erro {self.RetEndPoint.status_code} na chamada do endpoint: {Err}\nEndpoint: {self.EndPoint}\nResposta: {self.RetEndPoint.text}')
235
+ self.logger.critico(f'Erro [{self.RetEndPoint.status_code}] no lado servidor na resposta à requisição')
186
236
  raise Exception
187
237
  self.RetEndPoint.Espera = self.Espera ## adiona o tempo de espera ao retorno da API
188
238
  self.RetEndPoint.Intervalo = self.Intervalo ## adiciona o intervalo entre chamada ao retorno da API
@@ -192,7 +242,7 @@ Para uso em APIs com autenticação JWT (JSON Web Token), OAuth, Bearer Token Au
192
242
  return Err
193
243
  except Exception as Err:
194
244
  self.logger.critico(f'Falha na chamada do endpoint: {Err}\nEndpoint: {self.EndPoint}\nCodigo retorno: {self.RetEndPoint.status_code}\nResposta:{self.RetEndPoint.text}')
195
- return Err
245
+ return self.RetEndPoint
196
246
  #
197
247
  #
198
248
  def trata_erro_sienge(CodRet, Retorno):
lbxtoolkit/postgresql.py CHANGED
@@ -37,7 +37,10 @@ arquivo_csv = Path('./diretorio/arquivo_exemplo.csv')
37
37
  dados = postgreSQL.csv_df(arquivo_csv, CsvDelim=',') # usando vírgula como separador. se omisso, assume ";'
38
38
  ```
39
39
 
40
- 1. O método `postgreSQl.db_insert_df()` insere dados a partir de um Dataframe (pandas) em uma tabela do banco com estrutura de colunas equivalente.
40
+ Qualquer argumento da função read_csv do Pandas é aceito na chamada do método.
41
+
42
+
43
+ 3. O método `postgreSQl.db_insert_df()` insere dados a partir de um Dataframe (pandas) em uma tabela do banco com estrutura de colunas equivalente.
41
44
 
42
45
  A assinatura da função é `postgreSQL.db_insert_df([conexao], [dataframe_origem], [tabela_destino], Schema=None, Colunas=None, OnConflict=None)`
43
46
 
@@ -150,9 +153,12 @@ conexao.close()
150
153
  raise
151
154
  #
152
155
  #
153
- def csv_df(self, CsvPath, CsvDelim=';'): # Le arquivo CSV e gera Dataframe do Pandas
156
+ def csv_df(self, CsvPath, CsvDelim=';', **kwargs): # Le arquivo CSV e gera Dataframe do Pandas
157
+ """
158
+ Os parametros de read_csv() do Pandas podem ser passados opcionalmente para a função para ajustar a importação
159
+ """
154
160
  try:
155
- DataFrame = pd.read_csv(CsvPath, delimiter=CsvDelim) # Verifique se o delimitador é ';'
161
+ DataFrame = pd.read_csv(CsvPath, delimiter=CsvDelim, **kwargs) # Verifique se o delimitador é ';'
156
162
  DataFrame.replace({np.nan: None}, inplace=True) ## troca 'NaN' por None (null no postgresql)
157
163
  return DataFrame
158
164
  except Exception as Err:
@@ -202,10 +208,10 @@ conexao.close()
202
208
  #
203
209
  def db_update(self, Query): # Retorna um cursor à partir de um select
204
210
  UpdRows = 0
205
- BlackList = ['INSERT ', 'DELETE ', 'SELECT ', 'CREATE ', 'DROP ', 'MERGE ', 'REPLACE ', 'CALL ', 'EXECUTE ']
211
+ BlackList = ['INSERT ', 'SELECT ', 'CREATE ', 'DROP ', 'MERGE ', 'REPLACE ', 'CALL ', 'EXECUTE ']
206
212
  if any(element in Query.upper() for element in BlackList):
207
213
  BlackListed = [element for element in BlackList if element in Query.upper()]
208
- self.logger.erro(f'{__name__}: Este método permite apenas updates. A query informada possui as seguintes palavras reservadas não aceitas: {BlackListed} e não foi executada!')
214
+ self.logger.erro(f'{__name__}: Este método permite apenas updates e deletes. A query informada possui as seguintes palavras reservadas não aceitas: {BlackListed} e não foi executada!')
209
215
  return None
210
216
  else:
211
217
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lbxtoolkit
3
- Version: 2.2.6
3
+ Version: 2.2.8
4
4
  Summary:
5
5
  Author: Cristiano P. Ferrari
6
6
  Author-email: cristiano.ferrari@lbx.com.br
@@ -508,7 +508,9 @@ Recursos de interação com o banco de dados relacional PostgreSQL
508
508
  dados = postgreSQL.csv_df(arquivo_csv, CsvDelim=',') # usando vírgula como separador. se omisso, assume ";'
509
509
  ```
510
510
 
511
- 1. O método `postgreSQl.db_insert_df()` insere dados a partir de um Dataframe (pandas) em uma tabela do banco com estrutura de colunas equivalente.
511
+ Qualquer argumento da função `read_csv()` pode ser repassado na chamada do método.
512
+
513
+ 3. O método `postgreSQl.db_insert_df()` insere dados a partir de um Dataframe (pandas) em uma tabela do banco com estrutura de colunas equivalente.
512
514
 
513
515
  A assinatura da função é `postgreSQL.db_insert_df([conexao], [dataframe_origem], [tabela_destino], Schema=None, Colunas=None, OnConflict=None)`
514
516
 
@@ -1,12 +1,12 @@
1
1
  lbxtoolkit/__init__.py,sha256=DbLn2XbgrDKcPhk0MR5hmFYVIRTOjyF_HSmKw1JtSOQ,5923
2
- lbxtoolkit/api_rest.py,sha256=rtdJoTBCSo7X4Q_vS_dWk4HizEm3gVsReHNSFZq_eTU,11624
2
+ lbxtoolkit/api_rest.py,sha256=8OpmCAwCLWIHU2C_caIb8qvu52kav7dKpJP0Ak1zUww,14736
3
3
  lbxtoolkit/auth_entra_id.py,sha256=2iE7KpRhdh4u7Y4lem63IUkEPl_GpSLRSw45_Byn1s0,21922
4
4
  lbxtoolkit/config_manager.py,sha256=n3pVsxKykiYsgRuJNcNrq-bdEAjDHLmeCySl33DsoNE,1629
5
5
  lbxtoolkit/lbx_logger.py,sha256=iInkOlKdUzm-FSJOvcj-8D-uGJlAcNfjqrb0Q0TJ48Y,23433
6
6
  lbxtoolkit/misc.py,sha256=RCIsIi1z_QSZW_jMEHYR9QSO0hdppKwV_QnKH7AVg8A,5282
7
- lbxtoolkit/postgresql.py,sha256=UzjeA675cDG0_reVLUf_2UJm1X_r7wRfAsxAmaYRzhk,10898
7
+ lbxtoolkit/postgresql.py,sha256=OC0Iw9sbEthagcESqotodUGFUD6iIycg16ENnsDS6p4,11155
8
8
  lbxtoolkit/service.py,sha256=KnkoybzKuO1t4tWkK8xGBylMnq-MMtwhGndf451M57A,19091
9
9
  lbxtoolkit/service_windows.py,sha256=LTqITqOEWVSvp5slHG7NpRZV0-NYqI9tAgMXRvkSibM,15226
10
- lbxtoolkit-2.2.6.dist-info/METADATA,sha256=iq6JDBnYK0gEMFS-Y_hZU1HXR4SVYwRN7i1CAc_cVrA,46701
11
- lbxtoolkit-2.2.6.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
12
- lbxtoolkit-2.2.6.dist-info/RECORD,,
10
+ lbxtoolkit-2.2.8.dist-info/METADATA,sha256=a_f305BcReKYM3N1-wpHcDi2ZQ6wJDkI_m561kqwldE,46792
11
+ lbxtoolkit-2.2.8.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
12
+ lbxtoolkit-2.2.8.dist-info/RECORD,,