From 7b539ea42f8595a8cb0a4f633568a463817b537e Mon Sep 17 00:00:00 2001 From: Jonas Linter Date: Sat, 27 Sep 2025 17:06:54 +0200 Subject: [PATCH] Updated requirements. Added --- .gitignore | 4 + config/config.yaml | 10 ++ pyproject.toml | 2 + src/alpine_bits_python/config_loader.py | 10 ++ src/alpine_bits_python/db.py | 60 ++++++++ src/alpine_bits_python/main.py | 95 +++++++++---- uv.lock | 175 ++++++++++++++++++++++++ 7 files changed, 327 insertions(+), 29 deletions(-) create mode 100644 src/alpine_bits_python/config_loader.py create mode 100644 src/alpine_bits_python/db.py diff --git a/.gitignore b/.gitignore index 2efd606..26e0ce5 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,7 @@ wheels/ # ignore test_data content but keep the folder test_data/* + + +# ignore secrets +secrets.yaml diff --git a/config/config.yaml b/config/config.yaml index e69de29..e1a83c9 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -0,0 +1,10 @@ +# AlpineBits Python config +# Use annotatedyaml for secrets and environment-specific overrides + +database: + url: "sqlite:///alpinebits.db" # For local dev, use SQLite. For prod, override with PostgreSQL URL. + # url: "postgresql://user:password@host:port/dbname" # Example for Postgres + +secrets: + # Example: API keys, tokens, etc. Use annotatedyaml to mark these as secrets. + # api_key: !secret "my-secret-key" diff --git a/pyproject.toml b/pyproject.toml index 663176b..9c152ba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,6 +9,7 @@ description = "Alpine Bits Python Server implementation" readme = "README.md" requires-python = ">=3.13" dependencies = [ + "annotatedyaml>=1.0.0", "dotenv>=0.9.9", "fastapi>=0.117.1", "generateds>=2.44.3", @@ -17,6 +18,7 @@ dependencies = [ "redis>=6.4.0", "ruff>=0.13.1", "slowapi>=0.1.9", + "sqlalchemy>=2.0.43", "uvicorn>=0.37.0", "xsdata-pydantic[cli,lxml,soap]>=24.5", "xsdata[cli,lxml,soap]>=25.7", diff --git a/src/alpine_bits_python/config_loader.py b/src/alpine_bits_python/config_loader.py new file mode 100644 index 0000000..90d4e9c --- /dev/null +++ b/src/alpine_bits_python/config_loader.py @@ -0,0 +1,10 @@ +import os +import yaml +import annotatedyaml + +CONFIG_PATH = os.path.join(os.path.dirname(__file__), '../../config/config.yaml') + +def load_config(): + with open(CONFIG_PATH, 'r', encoding='utf-8') as f: + # Use annotatedyaml to load secrets if present + return annotatedyaml.load(f) diff --git a/src/alpine_bits_python/db.py b/src/alpine_bits_python/db.py new file mode 100644 index 0000000..dd41835 --- /dev/null +++ b/src/alpine_bits_python/db.py @@ -0,0 +1,60 @@ +from sqlalchemy import create_engine, Column, Integer, String, Date, Boolean, ForeignKey, DateTime +from sqlalchemy.orm import declarative_base, relationship, sessionmaker +import os + +Base = declarative_base() + +class Customer(Base): + __tablename__ = 'customers' + id = Column(Integer, primary_key=True) + given_name = Column(String) + surname = Column(String) + name_prefix = Column(String) + email_address = Column(String) + phone = Column(String) + email_newsletter = Column(Boolean) + address_line = Column(String) + city_name = Column(String) + postal_code = Column(String) + country_code = Column(String) + gender = Column(String) + birth_date = Column(String) + language = Column(String) + reservations = relationship('Reservation', back_populates='customer') + +class Reservation(Base): + __tablename__ = 'reservations' + id = Column(Integer, primary_key=True) + customer_id = Column(Integer, ForeignKey('customers.id')) + start_date = Column(Date) + end_date = Column(Date) + num_adults = Column(Integer) + num_children = Column(Integer) + children_ages = Column(String) # comma-separated + offer = Column(String) + utm_comment = Column(String) + created_at = Column(DateTime) + customer = relationship('Customer', back_populates='reservations') + +class HashedCustomer(Base): + __tablename__ = 'hashed_customers' + id = Column(Integer, primary_key=True) + customer_id = Column(Integer) + hashed_email = Column(String) + hashed_phone = Column(String) + hashed_name = Column(String) + redacted_at = Column(DateTime) + + +def get_engine(): + db_url = os.environ.get('DATABASE_URL') + if db_url: + return create_engine(db_url) + # Default to local sqlite + return create_engine('sqlite:///alpinebits.db') + +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=get_engine()) + +def init_db(): + engine = get_engine() + Base.metadata.create_all(bind=engine) diff --git a/src/alpine_bits_python/main.py b/src/alpine_bits_python/main.py index e4d5f63..d7db8aa 100644 --- a/src/alpine_bits_python/main.py +++ b/src/alpine_bits_python/main.py @@ -2,7 +2,7 @@ from .alpinebits_guestrequests import ResGuest, RoomStay from .generated import alpinebits as ab from io import BytesIO import sys -from datetime import datetime, timezone +from datetime import datetime, timezone, date import re from xsdata_pydantic.bindings import XmlSerializer @@ -11,18 +11,29 @@ from .simplified_access import ( CommentsData, CommentListItemData, CustomerData, - HotelReservationIdData, PhoneTechType, AlpineBitsFactory, OtaMessageType ) +# DB and config +from .db import Customer as DBCustomer, Reservation as DBReservation, HashedCustomer, SessionLocal, init_db +from .config_loader import load_config +import hashlib + def main(): import json import os + # Load config (yaml, annotatedyaml) + config = load_config() + + # Init DB + init_db() + db = SessionLocal() + # Load data from JSON file json_path = os.path.join(os.path.dirname(__file__), '../../test_data/wix_test_data_20250927_070500.json') with open(json_path, 'r', encoding='utf-8') as f: @@ -61,6 +72,56 @@ def main(): except Exception: pass + # UTM and offer + utm_fields = [ + ("utm_Source", "utm_source"), + ("utm_Medium", "utm_medium"), + ("utm_Campaign", "utm_campaign"), + ("utm_Term", "utm_term"), + ("utm_Content", "utm_content"), + ] + utm_comment_text = [] + for label, field in utm_fields: + val = data.get(f"field:{field}") or data.get(label) + if val: + utm_comment_text.append(f"{label}: {val}") + utm_comment = " | ".join(utm_comment_text) if utm_comment_text else None + offer = data.get("field:angebot_auswaehlen") + + # Save customer and reservation to DB + db_customer = DBCustomer( + given_name=given_name, + surname=surname, + name_prefix=name_prefix, + email_address=email_address, + phone=phone, + email_newsletter=email_newsletter, + address_line=address_line, + city_name=city_name, + postal_code=postal_code, + country_code=country_code, + gender=gender, + birth_date=birth_date, + language=language, + ) + db.add(db_customer) + db.commit() + db.refresh(db_customer) + + db_reservation = DBReservation( + customer_id=db_customer.id, + start_date=date.fromisoformat(start_date) if start_date else None, + end_date=date.fromisoformat(end_date) if end_date else None, + num_adults=num_adults, + num_children=num_children, + children_ages=','.join(str(a) for a in children_ages), + offer=offer, + utm_comment=utm_comment, + created_at=datetime.now(timezone.utc), + ) + db.add(db_reservation) + db.commit() + # Success - use None instead of object() for cleaner XML output success = None @@ -69,11 +130,8 @@ def main(): type_value=ab.UniqueIdType2.VALUE_14, id="6b34fe24ac2ff811" ) - - - time_span = ab.OtaResRetrieveRs.ReservationsList.HotelReservation.RoomStays.RoomStay.TimeSpan( - start= start_date, end=end_date + start=start_date, end=end_date ) # RoomStay with TimeSpan @@ -108,22 +166,6 @@ def main(): alpine_bits_factory = AlpineBitsFactory() res_guests = alpine_bits_factory.create_res_guests(customer_data, OtaMessageType.RETRIEVE) - utm_fields = [ - ("utm_Source", "utm_source"), - ("utm_Medium", "utm_medium"), - ("utm_Campaign", "utm_campaign"), - ("utm_Term", "utm_term"), - ("utm_Content", "utm_content"), - ] - utm_comment_text = [] - for label, field in utm_fields: - val = data.get(f"field:{field}") or data.get(label) - if val: - utm_comment_text.append(f"{label}: {val}") - utm_comment = " | ".join(utm_comment_text) if utm_comment_text else None - - - hotel_res_id_data = HotelReservationIdData( res_id_type="13", res_id_value=data.get("field:fbclid") or data.get("field:gclid"), @@ -144,8 +186,6 @@ def main(): ) # Comments from UTM fields and other info - - comment = CommentData( name= ab.CommentName2.CUSTOMER_COMMENT, text="Wix form submission", @@ -156,8 +196,6 @@ def main(): )], ) - - comments_data = CommentsData(comments=[comment]) comments = alpine_bits_factory.create(comments_data, OtaMessageType.RETRIEVE) @@ -235,6 +273,5 @@ def main(): except Exception as e: print(f"❌ Validation/Serialization failed: {e}") - -if __name__ == "__main__": - main() + finally: + db.close() diff --git a/uv.lock b/uv.lock index ccb5e31..fa235c7 100644 --- a/uv.lock +++ b/uv.lock @@ -7,6 +7,7 @@ name = "alpine-bits-python-server" version = "0.1.2" source = { editable = "." } dependencies = [ + { name = "annotatedyaml" }, { name = "dotenv" }, { name = "fastapi" }, { name = "generateds" }, @@ -15,6 +16,7 @@ dependencies = [ { name = "redis" }, { name = "ruff" }, { name = "slowapi" }, + { name = "sqlalchemy" }, { name = "uvicorn" }, { name = "xsdata", extra = ["cli", "lxml", "soap"] }, { name = "xsdata-pydantic", extra = ["cli", "lxml", "soap"] }, @@ -22,6 +24,7 @@ dependencies = [ [package.metadata] requires-dist = [ + { name = "annotatedyaml", specifier = ">=1.0.0" }, { name = "dotenv", specifier = ">=0.9.9" }, { name = "fastapi", specifier = ">=0.117.1" }, { name = "generateds", specifier = ">=2.44.3" }, @@ -30,6 +33,7 @@ requires-dist = [ { name = "redis", specifier = ">=6.4.0" }, { name = "ruff", specifier = ">=0.13.1" }, { name = "slowapi", specifier = ">=0.1.9" }, + { name = "sqlalchemy", specifier = ">=2.0.43" }, { name = "uvicorn", specifier = ">=0.37.0" }, { name = "xsdata", extras = ["cli", "lxml", "soap"], specifier = ">=25.7" }, { name = "xsdata-pydantic", extras = ["cli", "lxml", "soap"], specifier = ">=24.5" }, @@ -44,6 +48,46 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, ] +[[package]] +name = "annotatedyaml" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "propcache" }, + { name = "pyyaml" }, + { name = "voluptuous" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/a7/fe560a0e2395a69415be19534451a78820117a7402e0d4a4b19311b63938/annotatedyaml-1.0.0.tar.gz", hash = "sha256:14ca00ee8e8fa0519a24059e38de4ef7e58358abf21fb5755d5f4d3ab9717ae6", size = 15346, upload-time = "2025-08-01T19:18:26.365Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/2a/f202b7449e57e31bf3df3cb91d52ca42d4619f162100271321ee10e0d1d9/annotatedyaml-1.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cd22387e4944ad61af32d30789979e697de70d9cd51c6ba98bf7519290e06dbf", size = 58716, upload-time = "2025-08-01T19:22:35.477Z" }, + { url = "https://files.pythonhosted.org/packages/90/d8/60df39db11a47644fe430cdd65bfe83b8733e41be8604a275d374ee6ba89/annotatedyaml-1.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b5134aee0cd807a0355a6bc97a383943e2498a839e039ec214cb493ed249327", size = 58386, upload-time = "2025-08-01T19:22:37.081Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e5/4650b5684427aa88fdbdfdbba33c3a5ef27efc4594155f7414827663296b/annotatedyaml-1.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:638a7d8653fa4c2f6adfc5608edd7943a8b398b8575752cee36a1f002fc9a4a1", size = 70500, upload-time = "2025-08-01T19:22:38.369Z" }, + { url = "https://files.pythonhosted.org/packages/9c/66/330b76ad43ceccf2d897ca14b65713b60038282c66cbf13a9a116487a1e5/annotatedyaml-1.0.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:019751d57ecb3fc975960a4ff432bfff602caea4875ce5af1d8996c66d9af7c3", size = 64814, upload-time = "2025-08-01T19:22:39.652Z" }, + { url = "https://files.pythonhosted.org/packages/17/30/6b9888e3dc7fb0dba9af4aa6f660c55121b2c927dccb5f7821c5124de907/annotatedyaml-1.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:690156bd1a8ac0dee12096cf933ee13a7b3029ecc17a06eddbdc38e96bccc67d", size = 71188, upload-time = "2025-08-01T19:22:40.696Z" }, + { url = "https://files.pythonhosted.org/packages/e8/b0/998ebb6bf773dff32e6e7465025829f1f8564a19c9dcd63550e6878891a0/annotatedyaml-1.0.0-cp313-cp313-manylinux_2_36_x86_64.whl", hash = "sha256:b4ce6ea9fe5690a53125d28ef8730ad6cad914eec82ebd598bc68b0a26ffe055", size = 69428, upload-time = "2025-08-01T19:18:24.892Z" }, + { url = "https://files.pythonhosted.org/packages/07/16/88d507292deb34761435188c896dd56ccca4ad3f40dda6473e55b86d94ac/annotatedyaml-1.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8c08f5a8adefd8032a0dc19980fefec9531f9b44e39b2ca25c27bd511db7b70c", size = 71142, upload-time = "2025-08-01T19:22:41.993Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3f/cae0e2ba5cacfc7937b4c6661864c69a3dec3ddcec7e48a952aa5321401f/annotatedyaml-1.0.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:7ae86ba9bb1c14b47376171be06ea920b5f99fa794dc783edde9158b32dfdaa2", size = 65678, upload-time = "2025-08-01T19:22:42.998Z" }, + { url = "https://files.pythonhosted.org/packages/6c/35/94b0575e7f94536f3f368238bc08d6a99df4d813cf6a960bd750e0dc669e/annotatedyaml-1.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:65438a2542bac3441e3f2be1578126fcb69de16031f27d65a493072b4f50012f", size = 71966, upload-time = "2025-08-01T19:22:44.28Z" }, + { url = "https://files.pythonhosted.org/packages/b6/da/36998f0b3a2e8be96a1e0a69a8a16952fcd13fed97e31210c790624210c5/annotatedyaml-1.0.0-cp313-cp313-win32.whl", hash = "sha256:4a39e4f2ecfb931a5d4143f164ded955f673a8e3e0414d8b7dea50cb79739665", size = 55949, upload-time = "2025-08-01T19:22:47.155Z" }, + { url = "https://files.pythonhosted.org/packages/90/04/1ea5526e02f29c82b1e8a25f3a502c89fd1de93a24f89e6eb501f001673f/annotatedyaml-1.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8969e9c9b92c1ee578615200580b0955ff683a1f7990fb1334872340dbcb3fd5", size = 60181, upload-time = "2025-08-01T19:22:48.579Z" }, + { url = "https://files.pythonhosted.org/packages/78/0f/1ea98daa17aa24feda1d4a1434bca5158d120519e79f7ae9063e58adf8cf/annotatedyaml-1.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:5895b2292dd141cf054653249ec8d0fdff6dfdeec894366378ecf7634fc90b2e", size = 58746, upload-time = "2025-08-01T19:22:49.597Z" }, + { url = "https://files.pythonhosted.org/packages/ab/b7/0a90df653c006022a7a5c382699159751cd9d8c3867913a3f1151d87be8f/annotatedyaml-1.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:22f8c38ee8f784dd5ee376a5d7dadec0bf76d8f5c366231df85e645bf2608f74", size = 58621, upload-time = "2025-08-01T19:22:51.133Z" }, + { url = "https://files.pythonhosted.org/packages/73/61/381124e728254827f0ab70f86cea31416fd299372e9777b735c4e7ba0954/annotatedyaml-1.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24136eb4868f1233d6e46728f0ff7028dd13038655105f7919242879231499a4", size = 71020, upload-time = "2025-08-01T19:22:52.565Z" }, + { url = "https://files.pythonhosted.org/packages/46/d4/cf089b9a83ad52359968e6ebf2edca61decbc9bcb9fa344f61b6ea655d67/annotatedyaml-1.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ae3670c327c1b19906757d7c9b78e87930fe463f2323cabc1994ae0d1badc8d8", size = 70998, upload-time = "2025-08-01T19:22:53.537Z" }, + { url = "https://files.pythonhosted.org/packages/f3/28/c1ce664bd094ded592b4b6fd04e2e79f64b5598ab2065bc578aad6f5255d/annotatedyaml-1.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7457fed9c2dad416309a4e4f9aacaacdab70d6492a892f37c23b0acb8bb31f09", size = 71632, upload-time = "2025-08-01T19:22:54.613Z" }, + { url = "https://files.pythonhosted.org/packages/7b/43/9c92718518f66a4f0d3a1d3a76f886fa881e365098d520c7a3f39d1652d6/annotatedyaml-1.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae74effa8bc1c3f2a1195f1d186a41806d97fd6b7f81c05be38393b67dbbfbdb", size = 72150, upload-time = "2025-08-01T19:22:55.664Z" }, + { url = "https://files.pythonhosted.org/packages/2e/36/306ac9f5e94871405d0f256d8e835b05cd20aeee2b68e33dfde1b02ed7aa/annotatedyaml-1.0.0-cp314-cp314-win32.whl", hash = "sha256:89ea081d55a3fe291a5a131f859a2dd9c2a7fb991da10785a3f24743a91403a9", size = 57125, upload-time = "2025-08-01T19:22:56.641Z" }, + { url = "https://files.pythonhosted.org/packages/7e/94/9a88a7a77a8324de818991a31ed56b0b046761f8f3d222da80f5565e6945/annotatedyaml-1.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:427fb462c6d6326f355c71fd90362adcfa58ddf5d8d4482fb0d2b691afec11ea", size = 61262, upload-time = "2025-08-01T19:22:57.754Z" }, + { url = "https://files.pythonhosted.org/packages/99/1b/a64ec83b1ea854bb79481ddd4af4c4cfd9d021d3f5817b1863cb4b1b83d0/annotatedyaml-1.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:bf22881a3bea4daa69eee99fc3aa5b5a7110b1a514533b6256559512aea9b459", size = 104485, upload-time = "2025-08-01T19:22:58.787Z" }, + { url = "https://files.pythonhosted.org/packages/ee/24/b0842661f87c52a5833a345ec334075b503a23253ae73eba1cd410852f0f/annotatedyaml-1.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b08df8682dcf4f3aea813b42074032c4621330373ee2c2fec2f967a9f38d6921", size = 104355, upload-time = "2025-08-01T19:22:59.958Z" }, + { url = "https://files.pythonhosted.org/packages/77/d2/674bcb54aa8a5d9075689a4124d5e8700799c6822874861689cc49012ee3/annotatedyaml-1.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e4d8389647936bb49e66884b3a91e291bbf3c34080d1c0f59fc8e2601ba0420", size = 130215, upload-time = "2025-08-01T19:23:01.244Z" }, + { url = "https://files.pythonhosted.org/packages/69/93/ff4aadf967e9efbab7b021b1ce2e5c67f7adaff8551b5591747013c3ecf4/annotatedyaml-1.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8c5312eafe6ec7a61f9e29e71edd577a844bffee4b64a15e2550df38a0ea9995", size = 128836, upload-time = "2025-08-01T19:23:03.332Z" }, + { url = "https://files.pythonhosted.org/packages/97/0a/f04dee491f3736d3e92a42faf5b821c16f3fe4a126cf15ed0d0ed45c3a69/annotatedyaml-1.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4b9056f207ee1a9b2cbb53143b06d38ee0dd56eafbf42d21f834d031cf98c827", size = 131073, upload-time = "2025-08-01T19:23:04.38Z" }, + { url = "https://files.pythonhosted.org/packages/88/3a/dbd3690dc5cc6a28e55a72ab449a81870f650e53ed136bf8d71a7561bdf3/annotatedyaml-1.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc3baca49035d6d825856af7f97b871742cc19594cd299d03e25a9ea9cc1e586", size = 131122, upload-time = "2025-08-01T19:23:05.76Z" }, + { url = "https://files.pythonhosted.org/packages/de/59/5f3f111a0d8ea6a53ff807672da525c21320bdbddd2abc99e13955fba8c6/annotatedyaml-1.0.0-cp314-cp314t-win32.whl", hash = "sha256:bf1b53367b8efd3cd6cef16482318aa4c9caa79ace99a75e3762ccfef121c338", size = 104890, upload-time = "2025-08-01T19:23:06.895Z" }, + { url = "https://files.pythonhosted.org/packages/8c/32/0254acfeda2f745699757bb878ce4425e9e5dd8f356b03dfa3157bcfa69d/annotatedyaml-1.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:fc33c172a4b980c70ce29bf1fc150dbbe249f248c266b51f9e631ad2bf01f4b4", size = 114351, upload-time = "2025-08-01T19:23:07.962Z" }, +] + [[package]] name = "anyio" version = "4.11.0" @@ -193,6 +237,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/84/79ca1e01337fe898cd303ac8d51151b4bea4891028b93ae5bf5e9cc911a9/generateDS-2.44.3-py3-none-any.whl", hash = "sha256:ae5db7105ca777182ba6549118c9aba1690ea341400af13ffbdbfbe1bc022299", size = 147394, upload-time = "2024-10-08T21:54:34.506Z" }, ] +[[package]] +name = "greenlet" +version = "3.2.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/b8/704d753a5a45507a7aab61f18db9509302ed3d0a27ac7e0359ec2905b1a6/greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d", size = 188260, upload-time = "2025-08-07T13:24:33.51Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload-time = "2025-08-07T13:15:50.011Z" }, + { url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload-time = "2025-08-07T13:42:57.23Z" }, + { url = "https://files.pythonhosted.org/packages/f7/0b/bc13f787394920b23073ca3b6c4a7a21396301ed75a655bcb47196b50e6e/greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", size = 655191, upload-time = "2025-08-07T13:45:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/f2/d6/6adde57d1345a8d0f14d31e4ab9c23cfe8e2cd39c3baf7674b4b0338d266/greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a", size = 649516, upload-time = "2025-08-07T13:53:16.314Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3b/3a3328a788d4a473889a2d403199932be55b1b0060f4ddd96ee7cdfcad10/greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", size = 652169, upload-time = "2025-08-07T13:18:32.861Z" }, + { url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload-time = "2025-08-07T13:18:31.636Z" }, + { url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload-time = "2025-08-07T13:42:41.117Z" }, + { url = "https://files.pythonhosted.org/packages/a2/15/0d5e4e1a66fab130d98168fe984c509249c833c1a3c16806b90f253ce7b9/greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae", size = 1149210, upload-time = "2025-08-07T13:18:24.072Z" }, + { url = "https://files.pythonhosted.org/packages/0b/55/2321e43595e6801e105fcfdee02b34c0f996eb71e6ddffca6b10b7e1d771/greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b", size = 299685, upload-time = "2025-08-07T13:24:38.824Z" }, + { url = "https://files.pythonhosted.org/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586, upload-time = "2025-08-07T13:16:08.004Z" }, + { url = "https://files.pythonhosted.org/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346, upload-time = "2025-08-07T13:42:59.944Z" }, + { url = "https://files.pythonhosted.org/packages/c0/aa/687d6b12ffb505a4447567d1f3abea23bd20e73a5bed63871178e0831b7a/greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5", size = 699218, upload-time = "2025-08-07T13:45:30.969Z" }, + { url = "https://files.pythonhosted.org/packages/dc/8b/29aae55436521f1d6f8ff4e12fb676f3400de7fcf27fccd1d4d17fd8fecd/greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", size = 694659, upload-time = "2025-08-07T13:53:17.759Z" }, + { url = "https://files.pythonhosted.org/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355, upload-time = "2025-08-07T13:18:34.517Z" }, + { url = "https://files.pythonhosted.org/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512, upload-time = "2025-08-07T13:18:33.969Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a5/6ddab2b4c112be95601c13428db1d8b6608a8b6039816f2ba09c346c08fc/greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01", size = 303425, upload-time = "2025-08-07T13:32:27.59Z" }, +] + [[package]] name = "h11" version = "0.16.0" @@ -336,6 +404,47 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "propcache" +version = "0.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/16/43264e4a779dd8588c21a70f0709665ee8f611211bdd2c87d952cfa7c776/propcache-0.3.2.tar.gz", hash = "sha256:20d7d62e4e7ef05f221e0db2856b979540686342e7dd9973b815599c7057e168", size = 44139, upload-time = "2025-06-09T22:56:06.081Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/d1/8c747fafa558c603c4ca19d8e20b288aa0c7cda74e9402f50f31eb65267e/propcache-0.3.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ca592ed634a73ca002967458187109265e980422116c0a107cf93d81f95af945", size = 71286, upload-time = "2025-06-09T22:54:54.369Z" }, + { url = "https://files.pythonhosted.org/packages/61/99/d606cb7986b60d89c36de8a85d58764323b3a5ff07770a99d8e993b3fa73/propcache-0.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9ecb0aad4020e275652ba3975740f241bd12a61f1a784df044cf7477a02bc252", size = 42425, upload-time = "2025-06-09T22:54:55.642Z" }, + { url = "https://files.pythonhosted.org/packages/8c/96/ef98f91bbb42b79e9bb82bdd348b255eb9d65f14dbbe3b1594644c4073f7/propcache-0.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7f08f1cc28bd2eade7a8a3d2954ccc673bb02062e3e7da09bc75d843386b342f", size = 41846, upload-time = "2025-06-09T22:54:57.246Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ad/3f0f9a705fb630d175146cd7b1d2bf5555c9beaed54e94132b21aac098a6/propcache-0.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a342c834734edb4be5ecb1e9fb48cb64b1e2320fccbd8c54bf8da8f2a84c33", size = 208871, upload-time = "2025-06-09T22:54:58.975Z" }, + { url = "https://files.pythonhosted.org/packages/3a/38/2085cda93d2c8b6ec3e92af2c89489a36a5886b712a34ab25de9fbca7992/propcache-0.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a544caaae1ac73f1fecfae70ded3e93728831affebd017d53449e3ac052ac1e", size = 215720, upload-time = "2025-06-09T22:55:00.471Z" }, + { url = "https://files.pythonhosted.org/packages/61/c1/d72ea2dc83ac7f2c8e182786ab0fc2c7bd123a1ff9b7975bee671866fe5f/propcache-0.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310d11aa44635298397db47a3ebce7db99a4cc4b9bbdfcf6c98a60c8d5261cf1", size = 215203, upload-time = "2025-06-09T22:55:01.834Z" }, + { url = "https://files.pythonhosted.org/packages/af/81/b324c44ae60c56ef12007105f1460d5c304b0626ab0cc6b07c8f2a9aa0b8/propcache-0.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c1396592321ac83157ac03a2023aa6cc4a3cc3cfdecb71090054c09e5a7cce3", size = 206365, upload-time = "2025-06-09T22:55:03.199Z" }, + { url = "https://files.pythonhosted.org/packages/09/73/88549128bb89e66d2aff242488f62869014ae092db63ccea53c1cc75a81d/propcache-0.3.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cabf5b5902272565e78197edb682017d21cf3b550ba0460ee473753f28d23c1", size = 196016, upload-time = "2025-06-09T22:55:04.518Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3f/3bdd14e737d145114a5eb83cb172903afba7242f67c5877f9909a20d948d/propcache-0.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0a2f2235ac46a7aa25bdeb03a9e7060f6ecbd213b1f9101c43b3090ffb971ef6", size = 205596, upload-time = "2025-06-09T22:55:05.942Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ca/2f4aa819c357d3107c3763d7ef42c03980f9ed5c48c82e01e25945d437c1/propcache-0.3.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:92b69e12e34869a6970fd2f3da91669899994b47c98f5d430b781c26f1d9f387", size = 200977, upload-time = "2025-06-09T22:55:07.792Z" }, + { url = "https://files.pythonhosted.org/packages/cd/4a/e65276c7477533c59085251ae88505caf6831c0e85ff8b2e31ebcbb949b1/propcache-0.3.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:54e02207c79968ebbdffc169591009f4474dde3b4679e16634d34c9363ff56b4", size = 197220, upload-time = "2025-06-09T22:55:09.173Z" }, + { url = "https://files.pythonhosted.org/packages/7c/54/fc7152e517cf5578278b242396ce4d4b36795423988ef39bb8cd5bf274c8/propcache-0.3.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4adfb44cb588001f68c5466579d3f1157ca07f7504fc91ec87862e2b8e556b88", size = 210642, upload-time = "2025-06-09T22:55:10.62Z" }, + { url = "https://files.pythonhosted.org/packages/b9/80/abeb4a896d2767bf5f1ea7b92eb7be6a5330645bd7fb844049c0e4045d9d/propcache-0.3.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fd3e6019dc1261cd0291ee8919dd91fbab7b169bb76aeef6c716833a3f65d206", size = 212789, upload-time = "2025-06-09T22:55:12.029Z" }, + { url = "https://files.pythonhosted.org/packages/b3/db/ea12a49aa7b2b6d68a5da8293dcf50068d48d088100ac016ad92a6a780e6/propcache-0.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4c181cad81158d71c41a2bce88edce078458e2dd5ffee7eddd6b05da85079f43", size = 205880, upload-time = "2025-06-09T22:55:13.45Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e5/9076a0bbbfb65d1198007059c65639dfd56266cf8e477a9707e4b1999ff4/propcache-0.3.2-cp313-cp313-win32.whl", hash = "sha256:8a08154613f2249519e549de2330cf8e2071c2887309a7b07fb56098f5170a02", size = 37220, upload-time = "2025-06-09T22:55:15.284Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f5/b369e026b09a26cd77aa88d8fffd69141d2ae00a2abaaf5380d2603f4b7f/propcache-0.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e41671f1594fc4ab0a6dec1351864713cb3a279910ae8b58f884a88a0a632c05", size = 40678, upload-time = "2025-06-09T22:55:16.445Z" }, + { url = "https://files.pythonhosted.org/packages/a4/3a/6ece377b55544941a08d03581c7bc400a3c8cd3c2865900a68d5de79e21f/propcache-0.3.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:9a3cf035bbaf035f109987d9d55dc90e4b0e36e04bbbb95af3055ef17194057b", size = 76560, upload-time = "2025-06-09T22:55:17.598Z" }, + { url = "https://files.pythonhosted.org/packages/0c/da/64a2bb16418740fa634b0e9c3d29edff1db07f56d3546ca2d86ddf0305e1/propcache-0.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:156c03d07dc1323d8dacaa221fbe028c5c70d16709cdd63502778e6c3ccca1b0", size = 44676, upload-time = "2025-06-09T22:55:18.922Z" }, + { url = "https://files.pythonhosted.org/packages/36/7b/f025e06ea51cb72c52fb87e9b395cced02786610b60a3ed51da8af017170/propcache-0.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74413c0ba02ba86f55cf60d18daab219f7e531620c15f1e23d95563f505efe7e", size = 44701, upload-time = "2025-06-09T22:55:20.106Z" }, + { url = "https://files.pythonhosted.org/packages/a4/00/faa1b1b7c3b74fc277f8642f32a4c72ba1d7b2de36d7cdfb676db7f4303e/propcache-0.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f066b437bb3fa39c58ff97ab2ca351db465157d68ed0440abecb21715eb24b28", size = 276934, upload-time = "2025-06-09T22:55:21.5Z" }, + { url = "https://files.pythonhosted.org/packages/74/ab/935beb6f1756e0476a4d5938ff44bf0d13a055fed880caf93859b4f1baf4/propcache-0.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1304b085c83067914721e7e9d9917d41ad87696bf70f0bc7dee450e9c71ad0a", size = 278316, upload-time = "2025-06-09T22:55:22.918Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9d/994a5c1ce4389610838d1caec74bdf0e98b306c70314d46dbe4fcf21a3e2/propcache-0.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab50cef01b372763a13333b4e54021bdcb291fc9a8e2ccb9c2df98be51bcde6c", size = 282619, upload-time = "2025-06-09T22:55:24.651Z" }, + { url = "https://files.pythonhosted.org/packages/2b/00/a10afce3d1ed0287cef2e09506d3be9822513f2c1e96457ee369adb9a6cd/propcache-0.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fad3b2a085ec259ad2c2842666b2a0a49dea8463579c606426128925af1ed725", size = 265896, upload-time = "2025-06-09T22:55:26.049Z" }, + { url = "https://files.pythonhosted.org/packages/2e/a8/2aa6716ffa566ca57c749edb909ad27884680887d68517e4be41b02299f3/propcache-0.3.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:261fa020c1c14deafd54c76b014956e2f86991af198c51139faf41c4d5e83892", size = 252111, upload-time = "2025-06-09T22:55:27.381Z" }, + { url = "https://files.pythonhosted.org/packages/36/4f/345ca9183b85ac29c8694b0941f7484bf419c7f0fea2d1e386b4f7893eed/propcache-0.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:46d7f8aa79c927e5f987ee3a80205c987717d3659f035c85cf0c3680526bdb44", size = 268334, upload-time = "2025-06-09T22:55:28.747Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ca/fcd54f78b59e3f97b3b9715501e3147f5340167733d27db423aa321e7148/propcache-0.3.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:6d8f3f0eebf73e3c0ff0e7853f68be638b4043c65a70517bb575eff54edd8dbe", size = 255026, upload-time = "2025-06-09T22:55:30.184Z" }, + { url = "https://files.pythonhosted.org/packages/8b/95/8e6a6bbbd78ac89c30c225210a5c687790e532ba4088afb8c0445b77ef37/propcache-0.3.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:03c89c1b14a5452cf15403e291c0ccd7751d5b9736ecb2c5bab977ad6c5bcd81", size = 250724, upload-time = "2025-06-09T22:55:31.646Z" }, + { url = "https://files.pythonhosted.org/packages/ee/b0/0dd03616142baba28e8b2d14ce5df6631b4673850a3d4f9c0f9dd714a404/propcache-0.3.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:0cc17efde71e12bbaad086d679ce575268d70bc123a5a71ea7ad76f70ba30bba", size = 268868, upload-time = "2025-06-09T22:55:33.209Z" }, + { url = "https://files.pythonhosted.org/packages/c5/98/2c12407a7e4fbacd94ddd32f3b1e3d5231e77c30ef7162b12a60e2dd5ce3/propcache-0.3.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:acdf05d00696bc0447e278bb53cb04ca72354e562cf88ea6f9107df8e7fd9770", size = 271322, upload-time = "2025-06-09T22:55:35.065Z" }, + { url = "https://files.pythonhosted.org/packages/35/91/9cb56efbb428b006bb85db28591e40b7736847b8331d43fe335acf95f6c8/propcache-0.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4445542398bd0b5d32df908031cb1b30d43ac848e20470a878b770ec2dcc6330", size = 265778, upload-time = "2025-06-09T22:55:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4c/b0fe775a2bdd01e176b14b574be679d84fc83958335790f7c9a686c1f468/propcache-0.3.2-cp313-cp313t-win32.whl", hash = "sha256:f86e5d7cd03afb3a1db8e9f9f6eff15794e79e791350ac48a8c924e6f439f394", size = 41175, upload-time = "2025-06-09T22:55:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ff/47f08595e3d9b5e149c150f88d9714574f1a7cbd89fe2817158a952674bf/propcache-0.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9704bedf6e7cbe3c65eca4379a9b53ee6a83749f047808cbb5044d40d7d72198", size = 44857, upload-time = "2025-06-09T22:55:39.687Z" }, + { url = "https://files.pythonhosted.org/packages/cc/35/cc0aaecf278bb4575b8555f2b137de5ab821595ddae9da9d3cd1da4072c7/propcache-0.3.2-py3-none-any.whl", hash = "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f", size = 12663, upload-time = "2025-06-09T22:56:04.484Z" }, +] + [[package]] name = "pydantic" version = "2.11.9" @@ -413,6 +522,42 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" }, ] +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + [[package]] name = "redis" version = "6.4.0" @@ -493,6 +638,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] +[[package]] +name = "sqlalchemy" +version = "2.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/bc/d59b5d97d27229b0e009bd9098cd81af71c2fa5549c580a0a67b9bed0496/sqlalchemy-2.0.43.tar.gz", hash = "sha256:788bfcef6787a7764169cfe9859fe425bf44559619e1d9f56f5bddf2ebf6f417", size = 9762949, upload-time = "2025-08-11T14:24:58.438Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/1c/a7260bd47a6fae7e03768bf66451437b36451143f36b285522b865987ced/sqlalchemy-2.0.43-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e7c08f57f75a2bb62d7ee80a89686a5e5669f199235c6d1dac75cd59374091c3", size = 2130598, upload-time = "2025-08-11T15:51:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/8e/84/8a337454e82388283830b3586ad7847aa9c76fdd4f1df09cdd1f94591873/sqlalchemy-2.0.43-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:14111d22c29efad445cd5021a70a8b42f7d9152d8ba7f73304c4d82460946aaa", size = 2118415, upload-time = "2025-08-11T15:51:17.256Z" }, + { url = "https://files.pythonhosted.org/packages/cf/ff/22ab2328148492c4d71899d62a0e65370ea66c877aea017a244a35733685/sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21b27b56eb2f82653168cefe6cb8e970cdaf4f3a6cb2c5e3c3c1cf3158968ff9", size = 3248707, upload-time = "2025-08-11T15:52:38.444Z" }, + { url = "https://files.pythonhosted.org/packages/dc/29/11ae2c2b981de60187f7cbc84277d9d21f101093d1b2e945c63774477aba/sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c5a9da957c56e43d72126a3f5845603da00e0293720b03bde0aacffcf2dc04f", size = 3253602, upload-time = "2025-08-11T15:56:37.348Z" }, + { url = "https://files.pythonhosted.org/packages/b8/61/987b6c23b12c56d2be451bc70900f67dd7d989d52b1ee64f239cf19aec69/sqlalchemy-2.0.43-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d79f9fdc9584ec83d1b3c75e9f4595c49017f5594fee1a2217117647225d738", size = 3183248, upload-time = "2025-08-11T15:52:39.865Z" }, + { url = "https://files.pythonhosted.org/packages/86/85/29d216002d4593c2ce1c0ec2cec46dda77bfbcd221e24caa6e85eff53d89/sqlalchemy-2.0.43-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9df7126fd9db49e3a5a3999442cc67e9ee8971f3cb9644250107d7296cb2a164", size = 3219363, upload-time = "2025-08-11T15:56:39.11Z" }, + { url = "https://files.pythonhosted.org/packages/b6/e4/bd78b01919c524f190b4905d47e7630bf4130b9f48fd971ae1c6225b6f6a/sqlalchemy-2.0.43-cp313-cp313-win32.whl", hash = "sha256:7f1ac7828857fcedb0361b48b9ac4821469f7694089d15550bbcf9ab22564a1d", size = 2096718, upload-time = "2025-08-11T15:55:05.349Z" }, + { url = "https://files.pythonhosted.org/packages/ac/a5/ca2f07a2a201f9497de1928f787926613db6307992fe5cda97624eb07c2f/sqlalchemy-2.0.43-cp313-cp313-win_amd64.whl", hash = "sha256:971ba928fcde01869361f504fcff3b7143b47d30de188b11c6357c0505824197", size = 2123200, upload-time = "2025-08-11T15:55:07.932Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d9/13bdde6521f322861fab67473cec4b1cc8999f3871953531cf61945fad92/sqlalchemy-2.0.43-py3-none-any.whl", hash = "sha256:1681c21dd2ccee222c2fe0bef671d1aef7c504087c9c4e800371cfcc8ac966fc", size = 1924759, upload-time = "2025-08-11T15:39:53.024Z" }, +] + [[package]] name = "starlette" version = "0.48.0" @@ -563,6 +729,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/85/cd/584a2ceb5532af99dd09e50919e3615ba99aa127e9850eafe5f31ddfdb9a/uvicorn-0.37.0-py3-none-any.whl", hash = "sha256:913b2b88672343739927ce381ff9e2ad62541f9f8289664fa1d1d3803fa2ce6c", size = 67976, upload-time = "2025-09-23T13:33:45.842Z" }, ] +[[package]] +name = "voluptuous" +version = "0.15.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/af/a54ce0fb6f1d867e0b9f0efe5f082a691f51ccf705188fca67a3ecefd7f4/voluptuous-0.15.2.tar.gz", hash = "sha256:6ffcab32c4d3230b4d2af3a577c87e1908a714a11f6f95570456b1849b0279aa", size = 51651, upload-time = "2024-07-02T19:10:00.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/a8/8f9cc6749331186e6a513bfe3745454f81d25f6e34c6024f88f80c71ed28/voluptuous-0.15.2-py3-none-any.whl", hash = "sha256:016348bc7788a9af9520b1764ebd4de0df41fe2138ebe9e06fa036bf86a65566", size = 31349, upload-time = "2024-07-02T19:09:58.125Z" }, +] + [[package]] name = "wrapt" version = "1.17.3"