first commit
This commit is contained in:
		
						commit
						d056689f57
					
				
							
								
								
									
										
											BIN
										
									
								
								__pycache__/main.cpython-311.pyc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								__pycache__/main.cpython-311.pyc
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										130
									
								
								main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								main.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,130 @@ | |||||||
|  | from fastapi import FastAPI, Query, HTTPException, Request | ||||||
|  | from pydantic import BaseModel, Field, ValidationError | ||||||
|  | from typing import Literal, Optional | ||||||
|  | import base64 | ||||||
|  | import json | ||||||
|  | import uvicorn | ||||||
|  | import logging | ||||||
|  | import urllib.parse  # Import for URL decoding | ||||||
|  | 
 | ||||||
|  | # Configure logging | ||||||
|  | logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') | ||||||
|  | logger = logging.getLogger(__name__) | ||||||
|  | 
 | ||||||
|  | app = FastAPI( | ||||||
|  |     title="Inbound Webhook for Messages", | ||||||
|  |     description="A FastAPI application to receive and process inbound messages via a webhook.", | ||||||
|  |     version="1.0.0" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | # Define the Pydantic model for the inbound message payload | ||||||
|  | class InboundMessage(BaseModel): | ||||||
|  |     """ | ||||||
|  |     Represents the structure of an inbound message received by the webhook. | ||||||
|  |     """ | ||||||
|  |     MessageId: str = Field(..., description="The unique ID of the message.") | ||||||
|  |     From: str = Field(..., description="The phone number of the message sender.") | ||||||
|  |     To: str = Field(..., description="The phone number of the message receiver.") | ||||||
|  |     Timestamp: int = Field(..., description="A Unix timestamp in milliseconds when the message was sent.") | ||||||
|  |     # Made DisplayName Optional as it seems to be missing in your actual incoming payload | ||||||
|  |     DisplayName: Optional[str] = Field(None, description="The display name of the message sender. Optional if not provided by source.") | ||||||
|  |     Type: Literal[ | ||||||
|  |         "TEXT", | ||||||
|  |         "LOCATION", | ||||||
|  |         "DOCUMENT", | ||||||
|  |         "VIDEO", | ||||||
|  |         "AUDIO", | ||||||
|  |         "REPLY", | ||||||
|  |         "IMAGE", | ||||||
|  |         "CONTACTS" | ||||||
|  |     ] = Field(..., description="The type of media resources included in the message.") | ||||||
|  |     Message: str = Field(..., description="The content of the message. Its interpretation depends on the 'Type' field.") | ||||||
|  |     Name: str = Field(..., description="The name of the end user.") | ||||||
|  | 
 | ||||||
|  | @app.get("/inbound-webhook") | ||||||
|  | async def receive_inbound_message( | ||||||
|  |     request: Request, | ||||||
|  |     response: str | ||||||
|  | ): | ||||||
|  |     """ | ||||||
|  |     Receives inbound messages from the webhook. | ||||||
|  |     The message payload is expected to be a URL-encoded, then Base64 encoded JSON string | ||||||
|  |     passed as a 'response' query parameter. | ||||||
|  |     """ | ||||||
|  |     logger.info(f"Received request from: {request.client.host}") | ||||||
|  |     # Log the first 100 characters of the raw 'response' for brevity and security | ||||||
|  |     logger.info(f"Raw 'response' query parameter (first 100 chars): {response[:100]}...") | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         # 1. URL-decode the 'response' parameter first | ||||||
|  |         # This handles characters like %3D, ensuring base64.b64decode gets the correct string. | ||||||
|  |         url_decoded_string = urllib.parse.unquote(response) | ||||||
|  |         logger.info(f"URL-decoded string: {url_decoded_string}") | ||||||
|  | 
 | ||||||
|  |         # 2. Base64 decode the URL-decoded string | ||||||
|  |         decoded_bytes = base64.b64decode(url_decoded_string) | ||||||
|  |         decoded_string = decoded_bytes.decode('utf-8') | ||||||
|  |         logger.info(f"Base64 decoded string: {decoded_string}") | ||||||
|  | 
 | ||||||
|  |         # 3. Parse the decoded string as JSON | ||||||
|  |         payload_data = json.loads(decoded_string) | ||||||
|  |         logger.info(f"Parsed JSON payload: {payload_data}") | ||||||
|  | 
 | ||||||
|  |         # Check if the payload is a list and extract the first item | ||||||
|  |         # This handles cases where the webhook sends an array containing a single message object. | ||||||
|  |         if isinstance(payload_data, list): | ||||||
|  |             if not payload_data: | ||||||
|  |                 raise HTTPException(status_code=400, detail="Empty list received in 'response' parameter.") | ||||||
|  |             # Assume we only care about the first message in the list for this use case | ||||||
|  |             message_data = payload_data[0] | ||||||
|  |             logger.info(f"Extracted single message from list: {message_data}") | ||||||
|  |         else: | ||||||
|  |             message_data = payload_data | ||||||
|  |             logger.info(f"Payload is a single object: {message_data}") | ||||||
|  | 
 | ||||||
|  |         # 4. Validate the JSON against the Pydantic model | ||||||
|  |         # This will automatically raise a ValidationError if the data doesn't match the model. | ||||||
|  |         inbound_message = InboundMessage(**message_data) | ||||||
|  |         logger.info(f"Successfully validated inbound message: {inbound_message.dict()}") | ||||||
|  | 
 | ||||||
|  |         # 5. Process the inbound message | ||||||
|  |         # This is where your custom business logic goes. | ||||||
|  |         logger.info(f"Processing message from '{inbound_message.From}' (DisplayName: {inbound_message.DisplayName}) of type '{inbound_message.Type}': '{inbound_message.Message}'") | ||||||
|  | 
 | ||||||
|  |         # Example: Specific handling based on message type | ||||||
|  |         if inbound_message.Type == "TEXT": | ||||||
|  |             logger.info(f"Text message content: {inbound_message.Message}") | ||||||
|  |             # You might want to respond to the text message here | ||||||
|  |         elif inbound_message.Type == "IMAGE": | ||||||
|  |             logger.info(f"Image message received. Message field might contain image URL/ID: {inbound_message.Message}") | ||||||
|  |             # Handle image specific logic, e.g., download image, analyze content | ||||||
|  |         # Add more specific handling for other message Types as needed (LOCATION, DOCUMENT, etc.) | ||||||
|  | 
 | ||||||
|  |         return { | ||||||
|  |             "status": "success", | ||||||
|  |             "message": "Inbound message received and processed successfully.", | ||||||
|  |             "received_data": inbound_message.dict() # Return the parsed data for verification/debugging | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     except (urllib.parse.DecompressionError, base64.binascii.Error, json.JSONDecodeError, ValidationError) as e: | ||||||
|  |         # Catch specific errors for better client feedback | ||||||
|  |         if isinstance(e, urllib.parse.DecompressionError): | ||||||
|  |             logger.error(f"URL decoding error: {e}") | ||||||
|  |             detail = f"Invalid URL encoding in 'response' parameter: {e}" | ||||||
|  |         elif isinstance(e, base64.binascii.Error): | ||||||
|  |             logger.error(f"Base64 decoding error: {e}") | ||||||
|  |             detail = f"Invalid Base64 encoding in URL-decoded 'response' parameter: {e}" | ||||||
|  |         elif isinstance(e, json.JSONDecodeError): | ||||||
|  |             logger.error(f"JSON decoding error: {e}") | ||||||
|  |             detail = f"Invalid JSON format in decoded 'response' data: {e}" | ||||||
|  |         elif isinstance(e, ValidationError): | ||||||
|  |             logger.error(f"Pydantic validation error: {e.errors()}") | ||||||
|  |             detail = f"Message data validation failed: {e.errors()}" | ||||||
|  |         raise HTTPException(status_code=400, detail=detail) | ||||||
|  |     except Exception as e: | ||||||
|  |         # Catch any other unexpected errors | ||||||
|  |         logger.error(f"An unexpected error occurred: {e}", exc_info=True) | ||||||
|  |         raise HTTPException(status_code=500, detail=f"Internal server error: {e}") | ||||||
|  | 
 | ||||||
|  | # To run this application, use Uvicorn from your terminal: | ||||||
|  | # uvicorn main:app --host 0.0.0.0 --port 8000 | ||||||
							
								
								
									
										327
									
								
								poetry.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										327
									
								
								poetry.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,327 @@ | |||||||
|  | # This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "annotated-types" | ||||||
|  | version = "0.7.0" | ||||||
|  | description = "Reusable constraint types to use with typing.Annotated" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8" | ||||||
|  | groups = ["main"] | ||||||
|  | files = [ | ||||||
|  |     {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, | ||||||
|  |     {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "anyio" | ||||||
|  | version = "4.9.0" | ||||||
|  | description = "High level compatibility layer for multiple asynchronous event loop implementations" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.9" | ||||||
|  | groups = ["main"] | ||||||
|  | files = [ | ||||||
|  |     {file = "anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c"}, | ||||||
|  |     {file = "anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.dependencies] | ||||||
|  | idna = ">=2.8" | ||||||
|  | sniffio = ">=1.1" | ||||||
|  | typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} | ||||||
|  | 
 | ||||||
|  | [package.extras] | ||||||
|  | doc = ["Sphinx (>=8.2,<9.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] | ||||||
|  | test = ["anyio[trio]", "blockbuster (>=1.5.23)", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""] | ||||||
|  | trio = ["trio (>=0.26.1)"] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "click" | ||||||
|  | version = "8.2.1" | ||||||
|  | description = "Composable command line interface toolkit" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.10" | ||||||
|  | groups = ["main"] | ||||||
|  | files = [ | ||||||
|  |     {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"}, | ||||||
|  |     {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.dependencies] | ||||||
|  | colorama = {version = "*", markers = "platform_system == \"Windows\""} | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "colorama" | ||||||
|  | version = "0.4.6" | ||||||
|  | description = "Cross-platform colored terminal text." | ||||||
|  | optional = false | ||||||
|  | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" | ||||||
|  | groups = ["main"] | ||||||
|  | markers = "platform_system == \"Windows\"" | ||||||
|  | files = [ | ||||||
|  |     {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, | ||||||
|  |     {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "fastapi" | ||||||
|  | version = "0.116.0" | ||||||
|  | description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8" | ||||||
|  | groups = ["main"] | ||||||
|  | files = [ | ||||||
|  |     {file = "fastapi-0.116.0-py3-none-any.whl", hash = "sha256:fdcc9ed272eaef038952923bef2b735c02372402d1203ee1210af4eea7a78d2b"}, | ||||||
|  |     {file = "fastapi-0.116.0.tar.gz", hash = "sha256:80dc0794627af0390353a6d1171618276616310d37d24faba6648398e57d687a"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.dependencies] | ||||||
|  | pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" | ||||||
|  | starlette = ">=0.40.0,<0.47.0" | ||||||
|  | typing-extensions = ">=4.8.0" | ||||||
|  | 
 | ||||||
|  | [package.extras] | ||||||
|  | all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] | ||||||
|  | standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] | ||||||
|  | standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[standard-no-fastapi-cloud-cli] (>=0.0.8)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "h11" | ||||||
|  | version = "0.16.0" | ||||||
|  | description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8" | ||||||
|  | groups = ["main"] | ||||||
|  | files = [ | ||||||
|  |     {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, | ||||||
|  |     {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "idna" | ||||||
|  | version = "3.10" | ||||||
|  | description = "Internationalized Domain Names in Applications (IDNA)" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.6" | ||||||
|  | groups = ["main"] | ||||||
|  | files = [ | ||||||
|  |     {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, | ||||||
|  |     {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.extras] | ||||||
|  | all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "pydantic" | ||||||
|  | version = "2.11.7" | ||||||
|  | description = "Data validation using Python type hints" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.9" | ||||||
|  | groups = ["main"] | ||||||
|  | files = [ | ||||||
|  |     {file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"}, | ||||||
|  |     {file = "pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.dependencies] | ||||||
|  | annotated-types = ">=0.6.0" | ||||||
|  | pydantic-core = "2.33.2" | ||||||
|  | typing-extensions = ">=4.12.2" | ||||||
|  | typing-inspection = ">=0.4.0" | ||||||
|  | 
 | ||||||
|  | [package.extras] | ||||||
|  | email = ["email-validator (>=2.0.0)"] | ||||||
|  | timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "pydantic-core" | ||||||
|  | version = "2.33.2" | ||||||
|  | description = "Core functionality for Pydantic validation and serialization" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.9" | ||||||
|  | groups = ["main"] | ||||||
|  | files = [ | ||||||
|  |     {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039"}, | ||||||
|  |     {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27"}, | ||||||
|  |     {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.dependencies] | ||||||
|  | typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "sniffio" | ||||||
|  | version = "1.3.1" | ||||||
|  | description = "Sniff out which async library your code is running under" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.7" | ||||||
|  | groups = ["main"] | ||||||
|  | files = [ | ||||||
|  |     {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, | ||||||
|  |     {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "starlette" | ||||||
|  | version = "0.46.2" | ||||||
|  | description = "The little ASGI library that shines." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.9" | ||||||
|  | groups = ["main"] | ||||||
|  | files = [ | ||||||
|  |     {file = "starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35"}, | ||||||
|  |     {file = "starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.dependencies] | ||||||
|  | anyio = ">=3.6.2,<5" | ||||||
|  | 
 | ||||||
|  | [package.extras] | ||||||
|  | full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "typing-extensions" | ||||||
|  | version = "4.14.1" | ||||||
|  | description = "Backported and Experimental Type Hints for Python 3.9+" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.9" | ||||||
|  | groups = ["main"] | ||||||
|  | files = [ | ||||||
|  |     {file = "typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76"}, | ||||||
|  |     {file = "typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "typing-inspection" | ||||||
|  | version = "0.4.1" | ||||||
|  | description = "Runtime typing introspection tools" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.9" | ||||||
|  | groups = ["main"] | ||||||
|  | files = [ | ||||||
|  |     {file = "typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51"}, | ||||||
|  |     {file = "typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.dependencies] | ||||||
|  | typing-extensions = ">=4.12.0" | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "uvicorn" | ||||||
|  | version = "0.35.0" | ||||||
|  | description = "The lightning-fast ASGI server." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.9" | ||||||
|  | groups = ["main"] | ||||||
|  | files = [ | ||||||
|  |     {file = "uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a"}, | ||||||
|  |     {file = "uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.dependencies] | ||||||
|  | click = ">=7.0" | ||||||
|  | h11 = ">=0.8" | ||||||
|  | 
 | ||||||
|  | [package.extras] | ||||||
|  | standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.13)", "websockets (>=10.4)"] | ||||||
|  | 
 | ||||||
|  | [metadata] | ||||||
|  | lock-version = "2.1" | ||||||
|  | python-versions = ">=3.11" | ||||||
|  | content-hash = "f14000fff03e9006cb994c7435cee931b77b14476deb67dcbaa71e166e2b4345" | ||||||
							
								
								
									
										18
									
								
								pyproject.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								pyproject.toml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | |||||||
|  | [project] | ||||||
|  | name = "waba" | ||||||
|  | version = "0.1.0" | ||||||
|  | description = "" | ||||||
|  | authors = [ | ||||||
|  |     {name = "Your Name",email = "you@example.com"} | ||||||
|  | ] | ||||||
|  | readme = "README.md" | ||||||
|  | requires-python = ">=3.11" | ||||||
|  | dependencies = [ | ||||||
|  |     "fastapi (>=0.116.0,<0.117.0)", | ||||||
|  |     "uvicorn (>=0.35.0,<0.36.0)" | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | [build-system] | ||||||
|  | requires = ["poetry-core>=2.0.0,<3.0.0"] | ||||||
|  | build-backend = "poetry.core.masonry.api" | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user