fix user
This commit is contained in:
@@ -32,11 +32,8 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool:
|
|||||||
email=new_image['email'],
|
email=new_image['email'],
|
||||||
cpf=new_image.get('cpf', None),
|
cpf=new_image.get('cpf', None),
|
||||||
)
|
)
|
||||||
except konviva.EmailAlreadyExists:
|
except konviva.EmailAlreadyExists as exc:
|
||||||
logger.info(
|
logger.exception(exc, email=new_image['email'])
|
||||||
'Email already exists, retrieving existing user',
|
|
||||||
email=new_image['email'],
|
|
||||||
)
|
|
||||||
|
|
||||||
r = konviva.get_users_by_email(new_image['email'])
|
r = konviva.get_users_by_email(new_image['email'])
|
||||||
user_id = glom(r, '0.IDUsuario')
|
user_id = glom(r, '0.IDUsuario')
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
import random
|
|
||||||
import string
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from urllib.parse import quote_plus, urlparse
|
from urllib.parse import quote_plus, urlparse
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
from aws_lambda_powertools.event_handler.exceptions import BadRequestError
|
from aws_lambda_powertools.event_handler.exceptions import BadRequestError
|
||||||
from glom import glom
|
from glom import glom
|
||||||
|
from layercake.strutils import random_str
|
||||||
|
|
||||||
from config import KONVIVA_API_URL, KONVIVA_SECRET_KEY
|
from config import KONVIVA_API_URL, KONVIVA_SECRET_KEY
|
||||||
|
|
||||||
@@ -19,16 +18,11 @@ headers = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def random_str(maxlen: int = 10) -> str:
|
|
||||||
"""Returns a random string of letters."""
|
|
||||||
return ''.join(random.choice(string.ascii_letters) for _ in range(maxlen))
|
|
||||||
|
|
||||||
|
|
||||||
class KonvivaError(BadRequestError):
|
class KonvivaError(BadRequestError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class EmailAlreadyExists(KonvivaError):
|
class EmailAlreadyExistsError(KonvivaError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@@ -77,7 +71,11 @@ def create_user(
|
|||||||
# Because Konviva does not return the proper HTTP status code
|
# Because Konviva does not return the proper HTTP status code
|
||||||
if err := glom(r.json(), 'errors', default=None):
|
if err := glom(r.json(), 'errors', default=None):
|
||||||
err = err[0] if isinstance(err, list) else err
|
err = err[0] if isinstance(err, list) else err
|
||||||
raise EmailAlreadyExists(err)
|
|
||||||
|
if err == 'Login já existente':
|
||||||
|
raise EmailAlreadyExistsError(err)
|
||||||
|
else:
|
||||||
|
raise KonvivaError(err)
|
||||||
|
|
||||||
return r.json().get('IDUsuario')
|
return r.json().get('IDUsuario')
|
||||||
|
|
||||||
@@ -85,7 +83,7 @@ def create_user(
|
|||||||
def get_users_by_email(email: str) -> list[dict]:
|
def get_users_by_email(email: str) -> list[dict]:
|
||||||
url = urlparse(KONVIVA_API_URL)._replace(
|
url = urlparse(KONVIVA_API_URL)._replace(
|
||||||
path='/action/api/getUsuariosByQuery',
|
path='/action/api/getUsuariosByQuery',
|
||||||
query=f'q=Email=={quote_plus(email)}',
|
query=f'q=Email=={quote_plus(email)} or Login=={quote_plus(email)}',
|
||||||
)
|
)
|
||||||
r = requests.get(
|
r = requests.get(
|
||||||
url=url.geturl(),
|
url=url.geturl(),
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ Globals:
|
|||||||
Architectures:
|
Architectures:
|
||||||
- x86_64
|
- x86_64
|
||||||
Layers:
|
Layers:
|
||||||
- !Sub arn:aws:lambda:sa-east-1:336641857101:layer:layercake:79
|
- !Sub arn:aws:lambda:sa-east-1:336641857101:layer:layercake:83
|
||||||
Environment:
|
Environment:
|
||||||
Variables:
|
Variables:
|
||||||
TZ: America/Sao_Paulo
|
TZ: America/Sao_Paulo
|
||||||
|
|||||||
70
konviva-events/uv.lock
generated
70
konviva-events/uv.lock
generated
@@ -333,6 +333,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454, upload-time = "2025-03-05T14:46:06.463Z" },
|
{ url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454, upload-time = "2025-03-05T14:46:06.463Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "dictdiffer"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/61/7b/35cbccb7effc5d7e40f4c55e2b79399e1853041997fcda15c9ff160abba0/dictdiffer-0.9.0.tar.gz", hash = "sha256:17bacf5fbfe613ccf1b6d512bd766e6b21fb798822a133aa86098b8ac9997578", size = 31513, upload-time = "2021-07-22T13:24:29.276Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/47/ef/4cb333825d10317a36a1154341ba37e6e9c087bac99c1990ef07ffdb376f/dictdiffer-0.9.0-py2.py3-none-any.whl", hash = "sha256:442bfc693cfcadaf46674575d2eba1c53b42f5e404218ca2c2ff549f2df56595", size = 16754, upload-time = "2021-07-22T13:24:26.783Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dnspython"
|
name = "dnspython"
|
||||||
version = "2.7.0"
|
version = "2.7.0"
|
||||||
@@ -342,48 +351,6 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632, upload-time = "2024-10-05T20:14:57.687Z" },
|
{ url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632, upload-time = "2024-10-05T20:14:57.687Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "elastic-transport"
|
|
||||||
version = "8.17.1"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
dependencies = [
|
|
||||||
{ name = "certifi" },
|
|
||||||
{ name = "urllib3" },
|
|
||||||
]
|
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/6a/54/d498a766ac8fa475f931da85a154666cc81a70f8eb4a780bc8e4e934e9ac/elastic_transport-8.17.1.tar.gz", hash = "sha256:5edef32ac864dca8e2f0a613ef63491ee8d6b8cfb52881fa7313ba9290cac6d2", size = 73425, upload-time = "2025-03-13T07:28:30.776Z" }
|
|
||||||
wheels = [
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/cf/cd/b71d5bc74cde7fc6fd9b2ff9389890f45d9762cbbbf81dc5e51fd7588c4a/elastic_transport-8.17.1-py3-none-any.whl", hash = "sha256:192718f498f1d10c5e9aa8b9cf32aed405e469a7f0e9d6a8923431dbb2c59fb8", size = 64969, upload-time = "2025-03-13T07:28:29.031Z" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "elasticsearch"
|
|
||||||
version = "8.18.1"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
dependencies = [
|
|
||||||
{ name = "elastic-transport" },
|
|
||||||
{ name = "python-dateutil" },
|
|
||||||
{ name = "typing-extensions" },
|
|
||||||
]
|
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/2a/e4/40fc0e8d9a646889ac3f865cd35e41835f3cf888c716c7aae82248e022f0/elasticsearch-8.18.1.tar.gz", hash = "sha256:998035f17a8c1fba7ae26b183dca797dcf95db86da6a7ecba56d31afc40f07c7", size = 750746, upload-time = "2025-04-29T09:32:16.361Z" }
|
|
||||||
wheels = [
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/33/62/f62e8a5c7c6f7b27481c9ffc248fb32078ad88878aa4f3731a83a14cc797/elasticsearch-8.18.1-py3-none-any.whl", hash = "sha256:1a8c8b5ec3ce5be88f96d2f898375671648e96272978bce0dee3137d9326aabb", size = 906320, upload-time = "2025-04-29T09:32:12.527Z" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "elasticsearch-dsl"
|
|
||||||
version = "8.18.0"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
dependencies = [
|
|
||||||
{ name = "elastic-transport" },
|
|
||||||
{ name = "elasticsearch" },
|
|
||||||
{ name = "python-dateutil" },
|
|
||||||
{ name = "typing-extensions" },
|
|
||||||
]
|
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/72/6d/00cbeee412a2dc825f0df18c98463a2e0b423b86800fba6c50ea2c627962/elasticsearch_dsl-8.18.0.tar.gz", hash = "sha256:763465dba9eae166add10567e924c65730aa122819b08bfe9a077e91b13b30d1", size = 31886, upload-time = "2025-04-16T11:54:14.412Z" }
|
|
||||||
wheels = [
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/77/a9/b200790a22585aeb023d88bd8b9fb222820e2976ce4239d401670116ae3c/elasticsearch_dsl-8.18.0-py3-none-any.whl", hash = "sha256:0522c5bb20c7abae69855109e650bf1166d486cbf706b5e1b29c28936a9102a3", size = 10406, upload-time = "2025-04-16T11:54:12.677Z" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "email-validator"
|
name = "email-validator"
|
||||||
version = "2.2.0"
|
version = "2.2.0"
|
||||||
@@ -560,13 +527,12 @@ dev = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "layercake"
|
name = "layercake"
|
||||||
version = "0.6.12"
|
version = "0.7.2"
|
||||||
source = { directory = "../layercake" }
|
source = { directory = "../layercake" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "arnparse" },
|
{ name = "arnparse" },
|
||||||
{ name = "aws-lambda-powertools", extra = ["all"] },
|
{ name = "aws-lambda-powertools", extra = ["all"] },
|
||||||
{ name = "elasticsearch" },
|
{ name = "dictdiffer" },
|
||||||
{ name = "elasticsearch-dsl" },
|
|
||||||
{ name = "ftfy" },
|
{ name = "ftfy" },
|
||||||
{ name = "glom" },
|
{ name = "glom" },
|
||||||
{ name = "jinja2" },
|
{ name = "jinja2" },
|
||||||
@@ -580,6 +546,7 @@ dependencies = [
|
|||||||
{ name = "requests" },
|
{ name = "requests" },
|
||||||
{ name = "smart-open", extra = ["s3"] },
|
{ name = "smart-open", extra = ["s3"] },
|
||||||
{ name = "sqlite-utils" },
|
{ name = "sqlite-utils" },
|
||||||
|
{ name = "unidecode" },
|
||||||
{ name = "weasyprint" },
|
{ name = "weasyprint" },
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -587,8 +554,7 @@ dependencies = [
|
|||||||
requires-dist = [
|
requires-dist = [
|
||||||
{ name = "arnparse", specifier = ">=0.0.2" },
|
{ name = "arnparse", specifier = ">=0.0.2" },
|
||||||
{ name = "aws-lambda-powertools", extras = ["all"], specifier = ">=3.8.0" },
|
{ name = "aws-lambda-powertools", extras = ["all"], specifier = ">=3.8.0" },
|
||||||
{ name = "elasticsearch", specifier = ">=8.17.2" },
|
{ name = "dictdiffer", specifier = ">=0.9.0" },
|
||||||
{ name = "elasticsearch-dsl", specifier = ">=8.17.1" },
|
|
||||||
{ name = "ftfy", specifier = ">=6.3.1" },
|
{ name = "ftfy", specifier = ">=6.3.1" },
|
||||||
{ name = "glom", specifier = ">=24.11.0" },
|
{ name = "glom", specifier = ">=24.11.0" },
|
||||||
{ name = "jinja2", specifier = ">=3.1.6" },
|
{ name = "jinja2", specifier = ">=3.1.6" },
|
||||||
@@ -602,6 +568,7 @@ requires-dist = [
|
|||||||
{ name = "requests", specifier = ">=2.32.3" },
|
{ name = "requests", specifier = ">=2.32.3" },
|
||||||
{ name = "smart-open", extras = ["s3"], specifier = ">=7.1.0" },
|
{ name = "smart-open", extras = ["s3"], specifier = ">=7.1.0" },
|
||||||
{ name = "sqlite-utils", specifier = ">=3.38" },
|
{ name = "sqlite-utils", specifier = ">=3.38" },
|
||||||
|
{ name = "unidecode", specifier = ">=1.4.0" },
|
||||||
{ name = "weasyprint", specifier = ">=65.0" },
|
{ name = "weasyprint", specifier = ">=65.0" },
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1111,6 +1078,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" },
|
{ url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unidecode"
|
||||||
|
version = "1.4.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149, upload-time = "2025-04-24T08:45:03.798Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837, upload-time = "2025-04-24T08:45:01.609Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "urllib3"
|
name = "urllib3"
|
||||||
version = "2.5.0"
|
version = "2.5.0"
|
||||||
|
|||||||
@@ -22,13 +22,15 @@ else:
|
|||||||
>>> User(name='Sérgio R Siqueira ').name
|
>>> User(name='Sérgio R Siqueira ').name
|
||||||
'Sérgio R Siqueira'
|
'Sérgio R Siqueira'
|
||||||
|
|
||||||
>>> User(name=' Sérgio R Siqueira ').name
|
>>> User(name=' Sérgio R Siqueira ').name
|
||||||
'Sérgio R Siqueira'
|
'Sérgio R Siqueira'
|
||||||
|
|
||||||
|
|
||||||
>>> User(name='Siqueira')
|
>>> User(name='Siqueira') # doctest: +ELLIPSIS
|
||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
...
|
...
|
||||||
|
pydantic_core._pydantic_core.ValidationError: 1 validation error for User
|
||||||
|
...
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -42,6 +44,7 @@ else:
|
|||||||
@classmethod
|
@classmethod
|
||||||
def _validate(cls, __input_value: str) -> str:
|
def _validate(cls, __input_value: str) -> str:
|
||||||
name = ftfy.fix_text(__input_value.strip())
|
name = ftfy.fix_text(__input_value.strip())
|
||||||
|
name = ' '.join(name.split())
|
||||||
|
|
||||||
if ' ' not in name:
|
if ' ' not in name:
|
||||||
raise ValueError('Invalid name.')
|
raise ValueError('Invalid name.')
|
||||||
@@ -67,10 +70,7 @@ class PaymentCardValidation:
|
|||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
...
|
...
|
||||||
pydantic_core._pydantic_core.ValidationError: 1 validation error for CreditCard
|
pydantic_core._pydantic_core.ValidationError: 1 validation error for CreditCard
|
||||||
exp
|
...
|
||||||
Value error, month must be in 1..12 [type=value_error, input_value='20/23', input_type=str]
|
|
||||||
For further information visit https://errors.pydantic.dev/2.4/v/value_error
|
|
||||||
|
|
||||||
|
|
||||||
>>> CreditCard(exp='12/23')
|
>>> CreditCard(exp='12/23')
|
||||||
CreditCard(exp=datetime.date(2023, 12, 1))
|
CreditCard(exp=datetime.date(2023, 12, 1))
|
||||||
@@ -175,4 +175,4 @@ else:
|
|||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
import doctest
|
import doctest
|
||||||
|
|
||||||
doctest.testmod()
|
doctest.testmod(optionflags=doctest.ELLIPSIS)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "layercake"
|
name = "layercake"
|
||||||
version = "0.7.1"
|
version = "0.7.2"
|
||||||
description = "Packages shared dependencies to optimize deployment and ensure consistency across functions."
|
description = "Packages shared dependencies to optimize deployment and ensure consistency across functions."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
authors = [
|
authors = [
|
||||||
@@ -25,6 +25,7 @@ dependencies = [
|
|||||||
"jinja2>=3.1.6",
|
"jinja2>=3.1.6",
|
||||||
"qrcode>=8.2",
|
"qrcode>=8.2",
|
||||||
"dictdiffer>=0.9.0",
|
"dictdiffer>=0.9.0",
|
||||||
|
"unidecode>=1.4.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[dependency-groups]
|
[dependency-groups]
|
||||||
|
|||||||
13
layercake/uv.lock
generated
13
layercake/uv.lock
generated
@@ -594,7 +594,7 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "layercake"
|
name = "layercake"
|
||||||
version = "0.7.0"
|
version = "0.7.2"
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "arnparse" },
|
{ name = "arnparse" },
|
||||||
@@ -613,6 +613,7 @@ dependencies = [
|
|||||||
{ name = "requests" },
|
{ name = "requests" },
|
||||||
{ name = "smart-open", extra = ["s3"] },
|
{ name = "smart-open", extra = ["s3"] },
|
||||||
{ name = "sqlite-utils" },
|
{ name = "sqlite-utils" },
|
||||||
|
{ name = "unidecode" },
|
||||||
{ name = "weasyprint" },
|
{ name = "weasyprint" },
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -644,6 +645,7 @@ requires-dist = [
|
|||||||
{ name = "requests", specifier = ">=2.32.3" },
|
{ name = "requests", specifier = ">=2.32.3" },
|
||||||
{ name = "smart-open", extras = ["s3"], specifier = ">=7.1.0" },
|
{ name = "smart-open", extras = ["s3"], specifier = ">=7.1.0" },
|
||||||
{ name = "sqlite-utils", specifier = ">=3.38" },
|
{ name = "sqlite-utils", specifier = ">=3.38" },
|
||||||
|
{ name = "unidecode", specifier = ">=1.4.0" },
|
||||||
{ name = "weasyprint", specifier = ">=65.0" },
|
{ name = "weasyprint", specifier = ">=65.0" },
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1224,6 +1226,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438, upload-time = "2024-06-07T18:52:13.582Z" },
|
{ url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438, upload-time = "2024-06-07T18:52:13.582Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unidecode"
|
||||||
|
version = "1.4.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149, upload-time = "2025-04-24T08:45:03.798Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837, upload-time = "2025-04-24T08:45:01.609Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "urllib3"
|
name = "urllib3"
|
||||||
version = "2.3.0"
|
version = "2.3.0"
|
||||||
|
|||||||
Reference in New Issue
Block a user