csc-cia-stne 0.0.52__py3-none-any.whl → 0.0.54__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/karavela.py CHANGED
@@ -1,4 +1,7 @@
1
1
  import os
2
+ from botcity.maestro import *
3
+ from typing import Optional
4
+
2
5
 
3
6
  class Karavela():
4
7
 
@@ -80,56 +83,67 @@ class Karavela():
80
83
 
81
84
  raise e
82
85
 
83
- def get_secret(self,name:str)->str:
84
- """Extrai a secret do ambiente
86
+
87
+ # def get_secret(self, name: str, maestro: Optional[BotMaestroSDK] = None) -> str:
88
+ # """Extrai a secret do ambiente
85
89
 
86
- Args:
87
- name (str): nome da variavel ou arquivo da secret
90
+ # Args:
91
+ # name (str): nome da variavel ou arquivo da secret
92
+ # maestro ( Optional[BotMaestroSDK]): Recebe o Maestro da Botcity. e opcional.
88
93
 
89
- Returns:
90
- str: string da secret armazenada na variável de ambiente ou no arquivo de secret
91
- """
94
+ # Returns:
95
+ # str: string da secret armazenada na variável de ambiente ou no arquivo de secret
96
+ # """
92
97
 
93
- # Tentando extrair da variavel de ambiente
94
- secret = os.getenv(name)
98
+ # # Tentando extrair da variavel de ambiente
99
+ # secret = os.getenv(name)
95
100
 
96
- # secret não encontrada em variavel de ambiente, tentando extrair do arquivo em /secret
97
- if secret is None:
101
+ # # secret não encontrada em variavel de ambiente, tentando extrair do arquivo em /secret
102
+ # if secret is None:
98
103
 
99
- # verifica na pasta ./secrets
100
- if os.path.exists(f"./secrets/{name}"):
104
+ # # verifica na pasta ./secrets
105
+ # if os.path.exists(f"./secrets/{name}"):
101
106
 
102
- with open(f"./secrets/{name}",'r') as secret_file:
107
+ # with open(f"./secrets/{name}",'r') as secret_file:
103
108
 
104
- secret = secret_file.read()
109
+ # secret = secret_file.read()
105
110
 
106
- # verifica na pasta ./.secrets
107
- elif os.path.exists(f"./.secrets/{name}"):
111
+ # # verifica na pasta ./.secrets
112
+ # elif os.path.exists(f"./.secrets/{name}"):
108
113
 
109
- with open(f"./.secrets/{name}",'r') as secret_file:
114
+ # with open(f"./.secrets/{name}",'r') as secret_file:
110
115
 
111
- secret = secret_file.read()
116
+ # secret = secret_file.read()
112
117
 
113
- # verifica na pasta ./private
114
- elif os.path.exists(f"./private/{name}"):
118
+ # # verifica na pasta ./private
119
+ # elif os.path.exists(f"./private/{name}"):
115
120
 
116
- with open(f"./private/{name}",'r') as secret_file:
121
+ # with open(f"./private/{name}",'r') as secret_file:
117
122
 
118
- secret = secret_file.read()
123
+ # secret = secret_file.read()
119
124
 
120
- # verifica na pasta ./.private
121
- elif os.path.exists(f"./.private/{name}"):
125
+ # # verifica na pasta ./.private
126
+ # elif os.path.exists(f"./.private/{name}"):
122
127
 
123
- with open(f"./.private/{name}",'r') as secret_file:
128
+ # with open(f"./.private/{name}",'r') as secret_file:
124
129
 
125
- secret = secret_file.read()
130
+ # secret = secret_file.read()
126
131
 
127
- # verifica na pasta /secrets
128
- elif os.path.exists(f"/secrets/{name}"):
132
+ # # verifica na pasta /secrets
133
+ # elif os.path.exists(f"/secrets/{name}"):
129
134
 
130
- with open(f"/secrets/{name}",'r') as secret_file:
135
+ # with open(f"/secrets/{name}",'r') as secret_file:
131
136
 
132
- secret = secret_file.read()
137
+ # secret = secret_file.read()
138
+
139
+ # elif maestro and isinstance(maestro, BotMaestroSDK):
140
+ # try:
141
+
142
+ # secret = maestro.get_credential(label=name, key=name)
143
+
144
+ # except Exception as e:
145
+
146
+ # secret = None
133
147
 
134
- return secret
148
+ # return secret
135
149
 
@@ -1,9 +1,10 @@
1
- from .functions import titulo, recriar_pasta, b64encode, b64decode, convert_bquery_result_to_json,get_config
1
+ from .functions import titulo, recriar_pasta, b64encode, b64decode, convert_bquery_result_to_json,get_config, get_secret
2
2
  __all__ = [
3
3
  "titulo",
4
4
  "recriar_pasta",
5
5
  "b64encode",
6
6
  "b64decode",
7
7
  "convert_bquery_result_to_json",
8
- "get_config"
8
+ "get_config",
9
+ "get_secret"
9
10
  ]
@@ -3,6 +3,7 @@ from .func_recriar_pastas import recriar_pasta
3
3
  from .func_b64 import b64decode, b64encode
4
4
  from .func_converters import convert_bquery_result_to_json
5
5
  from .func_settings import get_config
6
+ from .func_get_secret import get_secret
6
7
 
7
8
  __all__ = [
8
9
  "titulo",
@@ -10,5 +11,6 @@ __all__ = [
10
11
  "b64encode",
11
12
  "b64decode",
12
13
  "convert_bquery_result_to_json",
13
- "get_config"
14
+ "get_config",
15
+ "get_secret"
14
16
  ]
@@ -0,0 +1,67 @@
1
+ import os
2
+ from botcity.maestro import *
3
+ from typing import Optional
4
+
5
+ def get_secret(name: str, maestro: Optional[BotMaestroSDK] = None) -> str:
6
+ """
7
+ Extrai a secret do ambiente
8
+
9
+ Args:
10
+ name (str): nome da variavel ou arquivo da secret
11
+ maestro ( Optional[BotMaestroSDK]): Recebe o Maestro da Botcity. e opcional.
12
+
13
+ Returns:
14
+ str: string da secret armazenada na variável de ambiente ou no arquivo de secret
15
+ """
16
+
17
+ # Tentando extrair da variavel de ambiente
18
+ secret = os.getenv(name)
19
+
20
+ # secret não encontrada em variavel de ambiente, tentando extrair do arquivo em /secret
21
+ if secret is None:
22
+
23
+ # verifica na pasta ./secrets
24
+ if os.path.exists(f"./secrets/{name}"):
25
+
26
+ with open(f"./secrets/{name}",'r') as secret_file:
27
+
28
+ secret = secret_file.read()
29
+
30
+ # verifica na pasta ./.secrets
31
+ elif os.path.exists(f"./.secrets/{name}"):
32
+
33
+ with open(f"./.secrets/{name}",'r') as secret_file:
34
+
35
+ secret = secret_file.read()
36
+
37
+ # verifica na pasta ./private
38
+ elif os.path.exists(f"./private/{name}"):
39
+
40
+ with open(f"./private/{name}",'r') as secret_file:
41
+
42
+ secret = secret_file.read()
43
+
44
+ # verifica na pasta ./.private
45
+ elif os.path.exists(f"./.private/{name}"):
46
+
47
+ with open(f"./.private/{name}",'r') as secret_file:
48
+
49
+ secret = secret_file.read()
50
+
51
+ # verifica na pasta /secrets
52
+ elif os.path.exists(f"/secrets/{name}"):
53
+
54
+ with open(f"/secrets/{name}",'r') as secret_file:
55
+
56
+ secret = secret_file.read()
57
+
58
+ elif maestro and isinstance(maestro, BotMaestroSDK):
59
+ try:
60
+
61
+ secret = maestro.get_credential(label=name, key=name)
62
+
63
+ except Exception as e:
64
+
65
+ secret = None
66
+
67
+ return secret
@@ -10,6 +10,7 @@ class InitParamsValidator(BaseModel):
10
10
  disable_gpu (bool): Define se a aceleração de hardware será desabilitada.
11
11
  no_sandbox (bool): Define se o sandbox do navegador será desabilitado.
12
12
  timeout (int): O tempo limite para a execução de operações.
13
+ security (bool): Define se a segurança do navegador será habilitada.
13
14
  Métodos:
14
15
  check_str_basic(cls, value, info): Valida se o valor é uma string não vazia e se está dentro das opções permitidas.
15
16
  check_bool_input(cls, value, info): Valida se o valor é um booleano.
@@ -20,6 +21,7 @@ class InitParamsValidator(BaseModel):
20
21
  disable_gpu:bool
21
22
  no_sandbox:bool
22
23
  timeout:int
24
+ security:bool
23
25
 
24
26
  @field_validator('model')
25
27
  def check_str_basic(cls, value, info):
@@ -35,7 +37,7 @@ class InitParamsValidator(BaseModel):
35
37
  raise ValueError(f"O parametro 'model' deve ser um int e não um {type(value)} e não vazio")
36
38
  return value
37
39
 
38
- @field_validator('headless','disable_gpu','no_sandbox')
40
+ @field_validator('headless','disable_gpu','no_sandbox','security')
39
41
  def check_bool_input(cls, value, info):
40
42
  if not isinstance(value, bool):
41
43
  raise ValueError(f"O parametro '{info.field_name}' deve ser um boleano")
@@ -97,6 +99,60 @@ class SelectValueValidator():
97
99
  target:str
98
100
 
99
101
  @field_validator('target')
102
+ def check_str_basic(cls, value, info):
103
+ if not isinstance(value, str) or not value.strip():
104
+ raise ValueError(f"O parametro 'target' deve ser uma string e não um {type(value)} e não vazio")
105
+ return value
106
+
107
+
108
+ class VerifyServerValueValidator():
109
+ """
110
+ Classe responsável por validar o valor do servidor.
111
+ Atributos:
112
+ url (str): A URL a ser validada.
113
+ Métodos:
114
+ check_str_basic(value, info): Verifica se o valor é uma string não vazia.
115
+ """
116
+ url: str
117
+ """
118
+ Verifica se o valor é uma string não vazia.
119
+ Parâmetros:
120
+ value: O valor a ser verificado.
121
+ info: Informações adicionais.
122
+ Retorna:
123
+ str: O valor verificado.
124
+ Lança:
125
+ ValueError: Se o valor não for uma string ou se for vazio.
126
+ """
127
+
128
+ @field_validator('url')
129
+ def check_str_basic(cls, value, info):
130
+ if not isinstance(value, str) or not value.strip():
131
+ raise ValueError(f"O parametro 'target' deve ser uma string e não um {type(value)} e não vazio")
132
+ return value
133
+
134
+
135
+ class NavigateValidator():
136
+ """
137
+ Classe responsável por validar a navegação em uma URL.
138
+ Atributos:
139
+ url (str): A URL a ser validada.
140
+ Métodos:
141
+ check_str_basic(value, info): Valida se o valor fornecido é uma string não vazia.
142
+ """
143
+ url: str
144
+ """
145
+ Valida se o valor fornecido é uma string não vazia.
146
+ Parâmetros:
147
+ value: O valor a ser validado.
148
+ info: Informações adicionais.
149
+ Retorna:
150
+ str: O valor validado.
151
+ Lança:
152
+ ValueError: Se o valor não for uma string ou se for uma string vazia.
153
+ """
154
+
155
+ @field_validator('url')
100
156
  def check_str_basic(cls, value, info):
101
157
  if not isinstance(value, str) or not value.strip():
102
158
  raise ValueError(f"O parametro 'target' deve ser uma string e não um {type(value)} e não vazio")
csc_cia_stne/web.py CHANGED
@@ -11,17 +11,20 @@ from selenium.webdriver.support import expected_conditions as EC
11
11
  from botcity.web import WebBot, Browser
12
12
  from botcity.web.util import element_as_select
13
13
 
14
+ # Externa
15
+ import requests
16
+
14
17
  # Validador
15
18
  from pydantic import ValidationError
16
19
 
17
20
  # Validadores de parametros
18
- from .utilitarios.validations.web_validator import InitParamsValidator,ClickOnScreenValidator,InputValueValidator,SelectValueValidator
21
+ from .utilitarios.validations.web_validator import InitParamsValidator,ClickOnScreenValidator,InputValueValidator,SelectValueValidator,VerifyServerValueValidator,NavigateValidator
19
22
 
20
23
 
21
24
  class web_screen():
22
25
 
23
26
 
24
- def __init__(self,model:str="selenium",timeout:int=60,headless:bool=True,disable_gpu:bool=True,no_sandbox:bool=True):
27
+ def __init__(self,model:str="selenium",timeout:int=60,headless:bool=True,disable_gpu:bool=True,no_sandbox:bool=True,security:bool=True):
25
28
  """
26
29
  Inicializa a instância da classe Web.
27
30
  Parâmetros:
@@ -30,16 +33,18 @@ class web_screen():
30
33
  - headless (bool): Define se o navegador será executado em modo headless (sem interface gráfica).
31
34
  - disable_gpu (bool): Define se a aceleração de hardware do GPU será desabilitada.
32
35
  - no_sandbox (bool): Define se o sandbox do navegador será desabilitado.
36
+ - security (bool): Define se a segurança do navegador será habilitada.
33
37
  Raises:
34
38
  - ValueError: Se ocorrer um erro na validação dos dados de entrada da inicialização da instância.
35
39
  """
36
40
 
37
41
  self.model = model
38
42
  self.timeout = timeout
43
+ self.security = security
39
44
 
40
45
  try:
41
46
 
42
- InitParamsValidator(model=model,timeout=timeout, headless=headless, disable_gpu=disable_gpu, no_sandbox=no_sandbox)
47
+ InitParamsValidator(model=model,timeout=timeout, headless=headless, disable_gpu=disable_gpu, no_sandbox=no_sandbox, security=security)
43
48
 
44
49
  except ValidationError as e:
45
50
 
@@ -97,6 +102,105 @@ class web_screen():
97
102
 
98
103
  return self.web_bot
99
104
 
105
+
106
+ def verify_server(self,url:str):
107
+ """
108
+ Verifica se o servidor está ativo e acessível.
109
+ Args:
110
+ url (str): A URL do servidor a ser verificado.
111
+ Returns:
112
+ bool: True se o servidor estiver ativo e acessível, False caso contrário.
113
+ """
114
+
115
+ try:
116
+
117
+ VerifyServerValueValidator(url=url)
118
+
119
+ except ValidationError as e:
120
+
121
+ raise ValueError("Erro na validação dos dados de input:", e.errors())
122
+
123
+ try:
124
+
125
+ reply = requests.get(url, verify=self.security)
126
+
127
+ except:
128
+
129
+ return False
130
+
131
+ if reply.status_code == 200:
132
+
133
+ return True
134
+
135
+ return False
136
+
137
+
138
+ def navigate(self,url:str):
139
+ """
140
+ Navega para a URL especificada.
141
+ Args:
142
+ url (str): A URL para navegar.
143
+ Returns:
144
+ dict: Um dicionário contendo informações sobre o sucesso da navegação.
145
+ - 'success' (bool): Indica se a navegação foi bem-sucedida.
146
+ - 'details' (str): Detalhes adicionais sobre a navegação, caso haja algum erro.
147
+ - 'error' (Exception): A exceção ocorrida durante a navegação, caso haja algum erro.
148
+ """
149
+
150
+ try:
151
+
152
+ NavigateValidator(url=url)
153
+
154
+ except ValidationError as e:
155
+
156
+ raise ValueError("Erro na validação dos dados de input:", e.errors())
157
+
158
+ if not self.verify_server(url):
159
+
160
+ return {
161
+ 'success': False,
162
+ 'details': f"Não foi possível acessar o endereço {url}."
163
+ }
164
+
165
+ if self.model.upper() == "SELENIUM":
166
+
167
+ try:
168
+
169
+ self.bot.get(url)
170
+
171
+ return {
172
+ "success": True,
173
+ "error": None
174
+ }
175
+
176
+ except Exception as e:
177
+
178
+ return {
179
+ "success": False,
180
+ "details":None,
181
+ "error": e
182
+ }
183
+
184
+ else:
185
+
186
+ try:
187
+
188
+ self.bot.browse(url)
189
+
190
+ return {
191
+ "success": True,
192
+ "error": None
193
+ }
194
+
195
+ except Exception as e:
196
+
197
+ return {
198
+ "success": False,
199
+ "details":None,
200
+ "error": e
201
+ }
202
+
203
+
100
204
  def click_on_screen(self, target:str):
101
205
  """
102
206
  Clica em um elemento na tela.
@@ -347,4 +451,63 @@ class web_screen():
347
451
  "success": False,
348
452
  "details":None,
349
453
  "error": e
454
+ }
455
+
456
+
457
+ def close(self):
458
+ """
459
+ Fecha o navegador web.
460
+ Retorna um dicionário com as seguintes chaves:
461
+ - 'success': Indica se o fechamento foi bem-sucedido (True) ou não (False).
462
+ - 'details': Detalhes adicionais, caso ocorra algum erro durante o fechamento.
463
+ - 'error': Exceção ocorrida durante o fechamento, caso haja.
464
+ Se o modelo for 'SELENIUM', o método utiliza o método 'quit()' do objeto 'web_bot' para fechar o navegador.
465
+ Caso contrário, utiliza o método 'stop_browser()'.
466
+ Exemplo de retorno em caso de sucesso:
467
+ {
468
+ 'success': True,
469
+ 'error': None
470
+ Exemplo de retorno em caso de erro:
471
+ {
472
+ 'success': False,
473
+ 'details': None,
474
+ 'error': Exception
475
+ """
476
+
477
+ if self.model.upper() == "SELENIUM":
478
+
479
+ try:
480
+
481
+ self.web_bot.quit()
482
+
483
+ return {
484
+ "success": True,
485
+ "error": None
486
+ }
487
+
488
+ except Exception as e:
489
+
490
+ return {
491
+ "success": False,
492
+ "details": None,
493
+ "error": e
494
+ }
495
+
496
+ else:
497
+
498
+ try:
499
+
500
+ self.web_bot.stop_browser()
501
+
502
+ return {
503
+ "success": True,
504
+ "error": None
505
+ }
506
+
507
+ except Exception as e:
508
+
509
+ return {
510
+ "success": False,
511
+ "details": None,
512
+ "error": e
350
513
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: csc_cia_stne
3
- Version: 0.0.52
3
+ Version: 0.0.54
4
4
  Summary: Biblioteca do time CSC-CIA utilizada no desenvolvimento de RPAs
5
5
  License: MIT
6
6
  Keywords: karavela,csc,cia,stone,rpa,botcity
@@ -25,6 +25,7 @@ Requires-Dist: slack_sdk
25
25
  Requires-Dist: webdriver-manager
26
26
  Requires-Dist: botcity-framework-web
27
27
  Requires-Dist: email-validator
28
+ Requires-Dist: botcity-maestro-sdk
28
29
 
29
30
  Essa biblioteca é desenvolvida e atualizada pelo time **CSC-CIA** da **Stone**
30
31
 
@@ -4,18 +4,19 @@ csc_cia_stne/bc_sta.py,sha256=f75HJ7FLIDSJFLDTvvSvCYo9z0HchzP7rDY5WIdiKXY,16830
4
4
  csc_cia_stne/email.py,sha256=RK_TzWBVnUfpP-s5NvjTJJjzhICy8e2fME9EuaiySMY,8162
5
5
  csc_cia_stne/gcp_bigquery.py,sha256=jYxvqrWDOPkxc05U4aef7V5lL8ptqsE93lfn0dLFyvc,7385
6
6
  csc_cia_stne/google_drive.py,sha256=JcXKlRBSxf5CKM-alT4ZpqWVWLZQfIYIX42_nENoTgU,11896
7
- csc_cia_stne/karavela.py,sha256=LlpFiDu0ww7eh8F-oREWSQo2mVoQMibx0EGiHR6tznI,4231
7
+ csc_cia_stne/karavela.py,sha256=jJCYX43D49gGuzmwwK6bN9XVnv2dXdp9iHnnV5H1LMQ,4794
8
8
  csc_cia_stne/logger_json.py,sha256=CXxSCOFGMymDi8XE9SKnPKjW4D0wJLqDLnxqePS26i8,3187
9
9
  csc_cia_stne/logger_rich.py,sha256=WlMqxH1lMy-tzK0I4NpBRgSzPdHc2-YSU71N3SsKM5A,8338
10
10
  csc_cia_stne/provio.py,sha256=G-pDnHYLSp97joc7S7dvwjNvl3omnTmvdi3rOPQf5GA,3987
11
11
  csc_cia_stne/servicenow.py,sha256=cJtNtLZ8glWfs3OAzl78ZFlPyPz39CSBxHqpTdUU7i0,32136
12
12
  csc_cia_stne/slack.py,sha256=33_UNF7M529eIuWjmzSJFEZ4RmVNkFkuVxvxwsKY1tQ,8126
13
13
  csc_cia_stne/stne_admin.py,sha256=vnGSEzcmqWE42vg71oEuoRg6ENaGsZsXFOjxduSH4KU,23561
14
- csc_cia_stne/web.py,sha256=Qpe63EISJ4wWu59ljLLtO7KW9YuGtT9Io-lTpllcyqQ,11089
15
- csc_cia_stne/utilitarios/__init__.py,sha256=oWxCOFL2wxjs8KBgxoeA6-gVe4ulicVGDgdaw8jzvsY,253
16
- csc_cia_stne/utilitarios/functions/__init__.py,sha256=iSLKxM8lgPM1lJ51WZ1mwy36IW5iitfMRc_AnEtzpxg,364
14
+ csc_cia_stne/web.py,sha256=_pc6BzPy2x0RvqtZsByjtKcSuUqlVTevfmmmKbVWLhA,15417
15
+ csc_cia_stne/utilitarios/__init__.py,sha256=0FrfH9XklutPS4QlbGjNYPulNfO2LFQoFXRnJQm-pKE,283
16
+ csc_cia_stne/utilitarios/functions/__init__.py,sha256=rdEp4-g0hGu6QF0q6t9VtyedCpYqvQLf7xXlYKxnrrs,422
17
17
  csc_cia_stne/utilitarios/functions/func_b64.py,sha256=XGU34BIQQXWXBS0yM2B4A2wDlcrMl1unIJXjq4lpLnk,1254
18
18
  csc_cia_stne/utilitarios/functions/func_converters.py,sha256=EY1zvlBaRX7G1MceVSiRXwwKDQDZwUO9iECBL0fe5iU,481
19
+ csc_cia_stne/utilitarios/functions/func_get_secret.py,sha256=khTtUTE-acdA9lIM8l7weejDSqoTYlf59ypBdC_F_lw,2150
19
20
  csc_cia_stne/utilitarios/functions/func_recriar_pastas.py,sha256=4whZpB3aJQaCPJ3osMAQpKrzEhqYtJbljGWlx_OvKIM,826
20
21
  csc_cia_stne/utilitarios/functions/func_settings.py,sha256=XwlfqdcfocXQ8kTsDKZ6GsAtpzr0_u44AOTIMtdem7U,2059
21
22
  csc_cia_stne/utilitarios/functions/func_titulo.py,sha256=bH4tYxovTARF-g2kWUK_GIzzXt8egbVdp6mWD6fc_3I,5345
@@ -23,9 +24,9 @@ csc_cia_stne/utilitarios/validations/GcpBigQueryValidator.py,sha256=PfCeeQquheZk
23
24
  csc_cia_stne/utilitarios/validations/GoogleDriveValidator.py,sha256=PBo-AV2bjR__4o9jYxuXO-UyxjAZvVwYgMbtsrFK2sI,4537
24
25
  csc_cia_stne/utilitarios/validations/ServiceNowValidator.py,sha256=yleKUIo1ZfyloP9fDPNjv3JJXdLcocT81WIgRSYmqEA,14423
25
26
  csc_cia_stne/utilitarios/validations/__init__.py,sha256=O_qyEU2ji3u6LHUXZCXvUFsMpoMWL625qqHTXyXivTA,106
26
- csc_cia_stne/utilitarios/validations/web_validator.py,sha256=JzmTm8i_3A_2Sauu_UrYQG-rzwx0t5_Kd6w5VofpVWs,3919
27
- csc_cia_stne-0.0.52.dist-info/LICENCE,sha256=LPGMtgKki2C3KEZP7hDhA1HBrlq5JCHkIeStUCLEMx4,1073
28
- csc_cia_stne-0.0.52.dist-info/METADATA,sha256=AIuKDKXrX2ixgUB2NbK0Dr-fTguqVZX1ApQmqQZmjto,1225
29
- csc_cia_stne-0.0.52.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
30
- csc_cia_stne-0.0.52.dist-info/top_level.txt,sha256=ldo7GVv3tQx5KJvwBzdZzzQmjPys2NDVVn1rv0BOF2Q,13
31
- csc_cia_stne-0.0.52.dist-info/RECORD,,
27
+ csc_cia_stne/utilitarios/validations/web_validator.py,sha256=HYKYSpDv1RvRjZIuwTPt-AbEz-9392MxM_O329iYuSA,5722
28
+ csc_cia_stne-0.0.54.dist-info/LICENCE,sha256=LPGMtgKki2C3KEZP7hDhA1HBrlq5JCHkIeStUCLEMx4,1073
29
+ csc_cia_stne-0.0.54.dist-info/METADATA,sha256=eMEfBp3WXNQK11Caie0gt8RU8KU5dx5ev58UhBOH7lA,1260
30
+ csc_cia_stne-0.0.54.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
31
+ csc_cia_stne-0.0.54.dist-info/top_level.txt,sha256=ldo7GVv3tQx5KJvwBzdZzzQmjPys2NDVVn1rv0BOF2Q,13
32
+ csc_cia_stne-0.0.54.dist-info/RECORD,,