Spaces:
Sleeping
Sleeping
init commit
Browse files- .DS_Store +0 -0
- .python-version +1 -0
- Dockerfile +49 -0
- mcp_ifcopenshell/__init__.py +4 -0
- mcp_ifcopenshell/__main__.py +4 -0
- mcp_ifcopenshell/__pycache__/__init__.cpython-312.pyc +0 -0
- mcp_ifcopenshell/__pycache__/__main__.cpython-312.pyc +0 -0
- mcp_ifcopenshell/__pycache__/event_store.cpython-312.pyc +0 -0
- mcp_ifcopenshell/__pycache__/server.cpython-312.pyc +0 -0
- mcp_ifcopenshell/server.py +372 -0
- pyproject.toml +21 -0
- uv.lock +579 -0
.DS_Store
ADDED
|
Binary file (6.15 kB). View file
|
|
|
.python-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
3.12
|
Dockerfile
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Use a Python image with uv pre-installed
|
| 2 |
+
FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS uv
|
| 3 |
+
|
| 4 |
+
# Install the project into `/app`
|
| 5 |
+
WORKDIR /app
|
| 6 |
+
|
| 7 |
+
# Enable bytecode compilation
|
| 8 |
+
ENV UV_COMPILE_BYTECODE=1
|
| 9 |
+
|
| 10 |
+
# Copy from the cache instead of linking since it's a mounted volume
|
| 11 |
+
ENV UV_LINK_MODE=copy
|
| 12 |
+
|
| 13 |
+
# Install the project's dependencies using the lockfile and settings
|
| 14 |
+
RUN --mount=type=cache,target=/root/.cache/uv \
|
| 15 |
+
--mount=type=bind,source=uv.lock,target=uv.lock \
|
| 16 |
+
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
|
| 17 |
+
uv sync --frozen --no-install-project --no-dev --no-editable
|
| 18 |
+
|
| 19 |
+
# Then, add the rest of the project source code and install it
|
| 20 |
+
# Installing separately from its dependencies allows optimal layer caching
|
| 21 |
+
ADD . /app
|
| 22 |
+
RUN --mount=type=cache,target=/root/.cache/uv \
|
| 23 |
+
uv sync --frozen --no-dev --no-editable
|
| 24 |
+
|
| 25 |
+
FROM python:3.12-slim-bookworm
|
| 26 |
+
|
| 27 |
+
WORKDIR /app
|
| 28 |
+
|
| 29 |
+
# Copy the Python packages from the uv stage
|
| 30 |
+
COPY --from=uv /app/.venv /app/.venv
|
| 31 |
+
|
| 32 |
+
# Create an app user for better security
|
| 33 |
+
RUN groupadd -r app && useradd -r -g app app
|
| 34 |
+
RUN chown -R app:app /app
|
| 35 |
+
|
| 36 |
+
# Place executables in the environment at the front of the path
|
| 37 |
+
ENV PATH="/app/.venv/bin:$PATH"
|
| 38 |
+
|
| 39 |
+
# Set the user to run the application
|
| 40 |
+
USER app
|
| 41 |
+
|
| 42 |
+
# Set default port to 7860 if not provided
|
| 43 |
+
ENV PORT=7860
|
| 44 |
+
|
| 45 |
+
# Expose the port defined by the PORT environment variable
|
| 46 |
+
EXPOSE $PORT
|
| 47 |
+
|
| 48 |
+
# when running the container, add --db-path and a bind mount to the host's db file
|
| 49 |
+
ENTRYPOINT ["mcp-server-ifcopenshell"]
|
mcp_ifcopenshell/__init__.py
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from .server import main
|
| 2 |
+
|
| 3 |
+
if __name__ == "__main__":
|
| 4 |
+
main()
|
mcp_ifcopenshell/__main__.py
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from .server import main
|
| 2 |
+
|
| 3 |
+
if __name__ == "__main__":
|
| 4 |
+
main()
|
mcp_ifcopenshell/__pycache__/__init__.cpython-312.pyc
ADDED
|
Binary file (267 Bytes). View file
|
|
|
mcp_ifcopenshell/__pycache__/__main__.cpython-312.pyc
ADDED
|
Binary file (267 Bytes). View file
|
|
|
mcp_ifcopenshell/__pycache__/event_store.cpython-312.pyc
ADDED
|
Binary file (4.22 kB). View file
|
|
|
mcp_ifcopenshell/__pycache__/server.cpython-312.pyc
ADDED
|
Binary file (11.8 kB). View file
|
|
|
mcp_ifcopenshell/server.py
ADDED
|
@@ -0,0 +1,372 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import io
|
| 2 |
+
import os
|
| 3 |
+
import uuid
|
| 4 |
+
from typing import Any, Dict, List
|
| 5 |
+
|
| 6 |
+
import boto3
|
| 7 |
+
import ifcopenshell
|
| 8 |
+
from mcp.server.fastmcp import FastMCP
|
| 9 |
+
from starlette.requests import Request
|
| 10 |
+
from starlette.responses import PlainTextResponse
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
def main():
|
| 14 |
+
# Create an MCP server
|
| 15 |
+
mcp = FastMCP("IfcOpenShell MCP Server", stateless_http=True)
|
| 16 |
+
|
| 17 |
+
# Store for IFC models
|
| 18 |
+
models = {}
|
| 19 |
+
|
| 20 |
+
@mcp.tool()
|
| 21 |
+
def load_model(username: str, filename: str) -> str:
|
| 22 |
+
"""
|
| 23 |
+
Load an IFC model from S3 using environment variable for bucket name.
|
| 24 |
+
|
| 25 |
+
Args:
|
| 26 |
+
username: The username/email directory in S3 (e.g., 'giulia.daleo2G24H').
|
| 27 |
+
filename: The IFC filename to load (e.g., 'hotel.ifc').
|
| 28 |
+
|
| 29 |
+
Returns:
|
| 30 |
+
A model_id that can be used in subsequent calls.
|
| 31 |
+
"""
|
| 32 |
+
try:
|
| 33 |
+
# Get bucket name from environment variable
|
| 34 |
+
bucket_name = os.environ.get("S3_BUCKET_NAME")
|
| 35 |
+
if not bucket_name:
|
| 36 |
+
raise Exception("S3_BUCKET_NAME environment variable is not set")
|
| 37 |
+
|
| 38 |
+
# Set user email from parameter
|
| 39 |
+
user_email = username
|
| 40 |
+
file_name = filename
|
| 41 |
+
|
| 42 |
+
# Construct the object key
|
| 43 |
+
object_key = f"{user_email}/{file_name}"
|
| 44 |
+
|
| 45 |
+
# Create S3 client
|
| 46 |
+
s3_client = boto3.client("s3")
|
| 47 |
+
|
| 48 |
+
# Create a BytesIO object to store the file data in memory
|
| 49 |
+
file_data = io.BytesIO()
|
| 50 |
+
|
| 51 |
+
# Download the file directly to memory
|
| 52 |
+
s3_client.download_fileobj(bucket_name, object_key, file_data)
|
| 53 |
+
|
| 54 |
+
# save file locally
|
| 55 |
+
file_path = f"/tmp/{file_name}"
|
| 56 |
+
with open(file_path, "wb") as f:
|
| 57 |
+
f.write(file_data.getvalue())
|
| 58 |
+
|
| 59 |
+
# Load the model directly from the in-memory file
|
| 60 |
+
model = ifcopenshell.open(file_path)
|
| 61 |
+
|
| 62 |
+
# Clean up the local file if needed
|
| 63 |
+
os.remove(file_path)
|
| 64 |
+
|
| 65 |
+
# Generate a unique ID for this model
|
| 66 |
+
model_id = str(uuid.uuid4())
|
| 67 |
+
|
| 68 |
+
# Store the model for later use
|
| 69 |
+
models[model_id] = {
|
| 70 |
+
"model": model,
|
| 71 |
+
"source": {
|
| 72 |
+
"bucket": bucket_name,
|
| 73 |
+
"key": object_key,
|
| 74 |
+
"user_email": user_email,
|
| 75 |
+
"file_name": file_name,
|
| 76 |
+
},
|
| 77 |
+
}
|
| 78 |
+
|
| 79 |
+
return model_id
|
| 80 |
+
except Exception as e:
|
| 81 |
+
raise Exception(f"Failed to load model: {str(e)}")
|
| 82 |
+
|
| 83 |
+
@mcp.tool()
|
| 84 |
+
def filter_by_category(model_id: str, category: str) -> List[Dict[str, Any]]:
|
| 85 |
+
"""
|
| 86 |
+
Filter elements in the IFC model by category.
|
| 87 |
+
|
| 88 |
+
Args:
|
| 89 |
+
model_id: The ID of the model returned by load_model_from_s3.
|
| 90 |
+
category: The IFC category to filter by (e.g., "IfcDoor", "IfcWindow").
|
| 91 |
+
|
| 92 |
+
Returns:
|
| 93 |
+
A list of elements matching the category.
|
| 94 |
+
"""
|
| 95 |
+
if model_id not in models:
|
| 96 |
+
raise Exception(f"Model with ID {model_id} not found")
|
| 97 |
+
|
| 98 |
+
model = models[model_id]["model"]
|
| 99 |
+
|
| 100 |
+
try:
|
| 101 |
+
# Get elements by category
|
| 102 |
+
elements = model.by_type(category)
|
| 103 |
+
|
| 104 |
+
# Convert elements to a serializable format
|
| 105 |
+
result = []
|
| 106 |
+
for element in elements:
|
| 107 |
+
element_data = {
|
| 108 |
+
"id": element.id(),
|
| 109 |
+
"type": element.is_a(),
|
| 110 |
+
"guid": element.GlobalId if hasattr(element, "GlobalId") else None,
|
| 111 |
+
"name": element.Name if hasattr(element, "Name") else None,
|
| 112 |
+
}
|
| 113 |
+
|
| 114 |
+
# Add properties if available
|
| 115 |
+
if hasattr(element, "IsDefinedBy"):
|
| 116 |
+
properties = {}
|
| 117 |
+
for definition in element.IsDefinedBy:
|
| 118 |
+
if definition.is_a("IfcRelDefinesByProperties"):
|
| 119 |
+
property_set = definition.RelatingPropertyDefinition
|
| 120 |
+
if property_set.is_a("IfcPropertySet"):
|
| 121 |
+
for prop in property_set.HasProperties:
|
| 122 |
+
if prop.is_a("IfcPropertySingleValue"):
|
| 123 |
+
properties[prop.Name] = (
|
| 124 |
+
str(prop.NominalValue.wrappedValue)
|
| 125 |
+
if prop.NominalValue
|
| 126 |
+
else None
|
| 127 |
+
)
|
| 128 |
+
|
| 129 |
+
element_data["properties"] = properties
|
| 130 |
+
|
| 131 |
+
result.append(element_data)
|
| 132 |
+
|
| 133 |
+
return result
|
| 134 |
+
except Exception as e:
|
| 135 |
+
raise Exception(f"Error filtering by category: {str(e)}")
|
| 136 |
+
|
| 137 |
+
@mcp.tool()
|
| 138 |
+
def get_element_by_id(model_id: str, element_id: int) -> Dict[str, Any]:
|
| 139 |
+
"""
|
| 140 |
+
Get a specific element by its ID.
|
| 141 |
+
|
| 142 |
+
Args:
|
| 143 |
+
model_id: The ID of the model returned by load_model_from_s3.
|
| 144 |
+
element_id: The ID of the element to retrieve.
|
| 145 |
+
|
| 146 |
+
Returns:
|
| 147 |
+
The element details.
|
| 148 |
+
"""
|
| 149 |
+
if model_id not in models:
|
| 150 |
+
raise Exception(f"Model with ID {model_id} not found")
|
| 151 |
+
|
| 152 |
+
model = models[model_id]["model"]
|
| 153 |
+
|
| 154 |
+
try:
|
| 155 |
+
element = model.by_id(element_id)
|
| 156 |
+
|
| 157 |
+
element_data = {
|
| 158 |
+
"id": element.id(),
|
| 159 |
+
"type": element.is_a(),
|
| 160 |
+
"guid": element.GlobalId if hasattr(element, "GlobalId") else None,
|
| 161 |
+
"name": element.Name if hasattr(element, "Name") else None,
|
| 162 |
+
}
|
| 163 |
+
|
| 164 |
+
# Add properties if available
|
| 165 |
+
if hasattr(element, "IsDefinedBy"):
|
| 166 |
+
properties = {}
|
| 167 |
+
for definition in element.IsDefinedBy:
|
| 168 |
+
if definition.is_a("IfcRelDefinesByProperties"):
|
| 169 |
+
property_set = definition.RelatingPropertyDefinition
|
| 170 |
+
if property_set.is_a("IfcPropertySet"):
|
| 171 |
+
for prop in property_set.HasProperties:
|
| 172 |
+
if prop.is_a("IfcPropertySingleValue"):
|
| 173 |
+
properties[prop.Name] = (
|
| 174 |
+
str(prop.NominalValue.wrappedValue)
|
| 175 |
+
if prop.NominalValue
|
| 176 |
+
else None
|
| 177 |
+
)
|
| 178 |
+
|
| 179 |
+
element_data["properties"] = properties
|
| 180 |
+
|
| 181 |
+
return element_data
|
| 182 |
+
except Exception as e:
|
| 183 |
+
raise Exception(f"Error getting element by ID: {str(e)}")
|
| 184 |
+
|
| 185 |
+
# @server.tool()
|
| 186 |
+
# def get_model_info(model_id: str) -> Dict[str, Any]:
|
| 187 |
+
# """
|
| 188 |
+
# Get information about the loaded IFC model.
|
| 189 |
+
|
| 190 |
+
# Args:
|
| 191 |
+
# model_id: The ID of the model returned by load_model_from_s3.
|
| 192 |
+
|
| 193 |
+
# Returns:
|
| 194 |
+
# Information about the model.
|
| 195 |
+
# """
|
| 196 |
+
# if model_id not in models:
|
| 197 |
+
# raise Exception(f"Model with ID {model_id} not found")
|
| 198 |
+
|
| 199 |
+
# model = models[model_id]["model"]
|
| 200 |
+
|
| 201 |
+
# try:
|
| 202 |
+
# # Get the project
|
| 203 |
+
# project = model.by_type("IfcProject")[0]
|
| 204 |
+
|
| 205 |
+
# # Basic model info
|
| 206 |
+
# info = {
|
| 207 |
+
# "model_id": model_id,
|
| 208 |
+
# "schema": model.schema,
|
| 209 |
+
# "source": models[model_id]["source"],
|
| 210 |
+
# "project_name": project.Name if hasattr(project, "Name") else None,
|
| 211 |
+
# "category_counts": {},
|
| 212 |
+
# }
|
| 213 |
+
|
| 214 |
+
# # Count the number of elements by category
|
| 215 |
+
# for element in model.by_type("Ifc*"):
|
| 216 |
+
# category = element.is_a()
|
| 217 |
+
# if category in info["category_counts"]:
|
| 218 |
+
# info["category_counts"][category] += 1
|
| 219 |
+
# else:
|
| 220 |
+
# info["category_counts"][category] = 1
|
| 221 |
+
|
| 222 |
+
# return info
|
| 223 |
+
# except Exception as e:
|
| 224 |
+
# raise Exception(f"Error getting model info: {str(e)}")
|
| 225 |
+
|
| 226 |
+
@mcp.custom_route("/health", methods=["GET"])
|
| 227 |
+
async def health(request: Request) -> PlainTextResponse:
|
| 228 |
+
"""
|
| 229 |
+
A basic health check endpoint. Returns HTTP 200 with body "OK".
|
| 230 |
+
"""
|
| 231 |
+
return PlainTextResponse("OK")
|
| 232 |
+
|
| 233 |
+
@mcp.custom_route("/clear", methods=["GET"])
|
| 234 |
+
async def clear(request: Request) -> PlainTextResponse:
|
| 235 |
+
"""
|
| 236 |
+
Remove a model from memory using its model_id.
|
| 237 |
+
|
| 238 |
+
Query Parameters:
|
| 239 |
+
model_id: The ID of the model to remove from memory.
|
| 240 |
+
|
| 241 |
+
Returns:
|
| 242 |
+
Confirmation message as plain text.
|
| 243 |
+
"""
|
| 244 |
+
try:
|
| 245 |
+
# Extract model_id from query parameters
|
| 246 |
+
model_id = request.query_params.get("model_id")
|
| 247 |
+
|
| 248 |
+
# Validate parameters
|
| 249 |
+
if not model_id:
|
| 250 |
+
return PlainTextResponse(
|
| 251 |
+
"Error: 'model_id' query parameter is required", status_code=400
|
| 252 |
+
)
|
| 253 |
+
|
| 254 |
+
# Check if model exists
|
| 255 |
+
if model_id not in models:
|
| 256 |
+
return PlainTextResponse(
|
| 257 |
+
f"Error: Model with ID {model_id} not found", status_code=404
|
| 258 |
+
)
|
| 259 |
+
|
| 260 |
+
# Store model info for the response
|
| 261 |
+
source_info = models[model_id]["source"]
|
| 262 |
+
filename = source_info.get("file_name", "unknown")
|
| 263 |
+
|
| 264 |
+
# Remove the model from the dictionary
|
| 265 |
+
del models[model_id]
|
| 266 |
+
|
| 267 |
+
# Return success message
|
| 268 |
+
return PlainTextResponse(
|
| 269 |
+
f"Model {model_id} ({filename}) successfully removed from memory"
|
| 270 |
+
)
|
| 271 |
+
|
| 272 |
+
except Exception as e:
|
| 273 |
+
return PlainTextResponse(f"Error: {str(e)}", status_code=500)
|
| 274 |
+
|
| 275 |
+
@mcp.custom_route("/load", methods=["GET"])
|
| 276 |
+
async def load(request: Request) -> PlainTextResponse:
|
| 277 |
+
"""
|
| 278 |
+
Load an IFC model via HTTP request.
|
| 279 |
+
|
| 280 |
+
Query Parameters:
|
| 281 |
+
username: The username/email directory in S3 (e.g., 'giulia.daleo2G24H').
|
| 282 |
+
filename: The IFC filename to load (e.g., 'hotel.ifc').
|
| 283 |
+
|
| 284 |
+
Returns:
|
| 285 |
+
The model_id as plain text that can be used in subsequent calls.
|
| 286 |
+
"""
|
| 287 |
+
try:
|
| 288 |
+
# Extract query parameters
|
| 289 |
+
username = request.query_params.get("username")
|
| 290 |
+
filename = request.query_params.get("filename")
|
| 291 |
+
|
| 292 |
+
# Validate parameters
|
| 293 |
+
if not username or not filename:
|
| 294 |
+
return PlainTextResponse(
|
| 295 |
+
"Error: Both 'username' and 'filename' query parameters are required",
|
| 296 |
+
status_code=400,
|
| 297 |
+
)
|
| 298 |
+
|
| 299 |
+
# Get bucket name from environment variable
|
| 300 |
+
bucket_name = os.environ.get("S3_BUCKET_NAME")
|
| 301 |
+
if not bucket_name:
|
| 302 |
+
return PlainTextResponse(
|
| 303 |
+
"Error: S3_BUCKET_NAME environment variable is not set",
|
| 304 |
+
status_code=500,
|
| 305 |
+
)
|
| 306 |
+
|
| 307 |
+
# Set user email from parameter
|
| 308 |
+
user_email = username
|
| 309 |
+
file_name = filename
|
| 310 |
+
|
| 311 |
+
# Construct the object key
|
| 312 |
+
object_key = f"{user_email}/{file_name}"
|
| 313 |
+
|
| 314 |
+
# Create S3 client
|
| 315 |
+
s3_client = boto3.client("s3")
|
| 316 |
+
|
| 317 |
+
# Create a BytesIO object to store the file data in memory
|
| 318 |
+
file_data = io.BytesIO()
|
| 319 |
+
|
| 320 |
+
# Download the file directly to memory
|
| 321 |
+
try:
|
| 322 |
+
s3_client.download_fileobj(bucket_name, object_key, file_data)
|
| 323 |
+
except Exception as s3_error:
|
| 324 |
+
return PlainTextResponse(
|
| 325 |
+
f"Error downloading file from S3: {str(s3_error)}", status_code=404
|
| 326 |
+
)
|
| 327 |
+
|
| 328 |
+
# save file locally
|
| 329 |
+
file_path = f"/tmp/{file_name}"
|
| 330 |
+
with open(file_path, "wb") as f:
|
| 331 |
+
f.write(file_data.getvalue())
|
| 332 |
+
|
| 333 |
+
# Load the model directly from the in-memory file
|
| 334 |
+
try:
|
| 335 |
+
model = ifcopenshell.open(file_path)
|
| 336 |
+
except Exception as model_error:
|
| 337 |
+
# Clean up temp file if it exists
|
| 338 |
+
if os.path.exists(file_path):
|
| 339 |
+
os.remove(file_path)
|
| 340 |
+
return PlainTextResponse(
|
| 341 |
+
f"Error loading IFC model: {str(model_error)}", status_code=500
|
| 342 |
+
)
|
| 343 |
+
|
| 344 |
+
# Clean up the local file if needed
|
| 345 |
+
os.remove(file_path)
|
| 346 |
+
|
| 347 |
+
# Generate a unique ID for this model
|
| 348 |
+
model_id = str(uuid.uuid4())
|
| 349 |
+
|
| 350 |
+
# Store the model for later use
|
| 351 |
+
models[model_id] = {
|
| 352 |
+
"model": model,
|
| 353 |
+
"source": {
|
| 354 |
+
"bucket": bucket_name,
|
| 355 |
+
"key": object_key,
|
| 356 |
+
"user_email": user_email,
|
| 357 |
+
"file_name": file_name,
|
| 358 |
+
},
|
| 359 |
+
}
|
| 360 |
+
|
| 361 |
+
# Return the model_id as plain text
|
| 362 |
+
return PlainTextResponse(model_id)
|
| 363 |
+
|
| 364 |
+
except Exception as e:
|
| 365 |
+
return PlainTextResponse(f"Error: {str(e)}", status_code=500)
|
| 366 |
+
|
| 367 |
+
import uvicorn
|
| 368 |
+
|
| 369 |
+
port = int(os.environ.get("PORT", 7860))
|
| 370 |
+
uvicorn.run(mcp.streamable_http_app(), host="0.0.0.0", port=port)
|
| 371 |
+
|
| 372 |
+
return 0
|
pyproject.toml
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[project]
|
| 2 |
+
name = "mcp_ifcopenshell"
|
| 3 |
+
version = "0.1.0"
|
| 4 |
+
description = "Add your description here"
|
| 5 |
+
readme = "README.md"
|
| 6 |
+
requires-python = ">=3.12"
|
| 7 |
+
dependencies = [
|
| 8 |
+
"boto3>=1.38.25",
|
| 9 |
+
"ifcopenshell>=0.8.2",
|
| 10 |
+
"mcp[cli]>=1.9.1",
|
| 11 |
+
]
|
| 12 |
+
|
| 13 |
+
[project.scripts]
|
| 14 |
+
mcp_ifcopenshell = "mcp_ifcopenshell:main"
|
| 15 |
+
|
| 16 |
+
[build-system]
|
| 17 |
+
requires = ["hatchling"]
|
| 18 |
+
build-backend = "hatchling.build"
|
| 19 |
+
|
| 20 |
+
[tool.hatch.build.targets.wheel]
|
| 21 |
+
packages = ["mcp_ifcopenshell"]
|
uv.lock
ADDED
|
@@ -0,0 +1,579 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version = 1
|
| 2 |
+
revision = 2
|
| 3 |
+
requires-python = ">=3.12"
|
| 4 |
+
|
| 5 |
+
[[package]]
|
| 6 |
+
name = "annotated-types"
|
| 7 |
+
version = "0.7.0"
|
| 8 |
+
source = { registry = "https://pypi.org/simple" }
|
| 9 |
+
sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" }
|
| 10 |
+
wheels = [
|
| 11 |
+
{ 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" },
|
| 12 |
+
]
|
| 13 |
+
|
| 14 |
+
[[package]]
|
| 15 |
+
name = "anyio"
|
| 16 |
+
version = "4.9.0"
|
| 17 |
+
source = { registry = "https://pypi.org/simple" }
|
| 18 |
+
dependencies = [
|
| 19 |
+
{ name = "idna" },
|
| 20 |
+
{ name = "sniffio" },
|
| 21 |
+
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
|
| 22 |
+
]
|
| 23 |
+
sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" }
|
| 24 |
+
wheels = [
|
| 25 |
+
{ url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" },
|
| 26 |
+
]
|
| 27 |
+
|
| 28 |
+
[[package]]
|
| 29 |
+
name = "boto3"
|
| 30 |
+
version = "1.38.25"
|
| 31 |
+
source = { registry = "https://pypi.org/simple" }
|
| 32 |
+
dependencies = [
|
| 33 |
+
{ name = "botocore" },
|
| 34 |
+
{ name = "jmespath" },
|
| 35 |
+
{ name = "s3transfer" },
|
| 36 |
+
]
|
| 37 |
+
sdist = { url = "https://files.pythonhosted.org/packages/0d/af/404827da46c67359e6d2a63b0f4fadd5b6150551d25c405b3bd480c19319/boto3-1.38.25.tar.gz", hash = "sha256:85c1556a110896f68de8573a9b4757c81071448dbf6ffc1074941bfc8a43195e", size = 111819, upload-time = "2025-05-28T19:26:49.018Z" }
|
| 38 |
+
wheels = [
|
| 39 |
+
{ url = "https://files.pythonhosted.org/packages/5b/27/b2ea9d2494b1d35c3de23485bf6b0a7b8539dea965349c8829a1fd84d08e/boto3-1.38.25-py3-none-any.whl", hash = "sha256:2f2cd517dd31d33ace0eefe567dc903fdf74221513e32f1e9445bdfac7554db7", size = 139938, upload-time = "2025-05-28T19:26:44.902Z" },
|
| 40 |
+
]
|
| 41 |
+
|
| 42 |
+
[[package]]
|
| 43 |
+
name = "botocore"
|
| 44 |
+
version = "1.38.25"
|
| 45 |
+
source = { registry = "https://pypi.org/simple" }
|
| 46 |
+
dependencies = [
|
| 47 |
+
{ name = "jmespath" },
|
| 48 |
+
{ name = "python-dateutil" },
|
| 49 |
+
{ name = "urllib3" },
|
| 50 |
+
]
|
| 51 |
+
sdist = { url = "https://files.pythonhosted.org/packages/6b/00/bed5bf325d1fdb98d6212d106bd44cd0bbe65563e3a2c3f87b64cc4d75c2/botocore-1.38.25.tar.gz", hash = "sha256:8c73e97d9662a6c92be33dab66cd1e2b59797154c7ec379ce3bb5d6779d9d78c", size = 13914295, upload-time = "2025-05-28T19:26:35.457Z" }
|
| 52 |
+
wheels = [
|
| 53 |
+
{ url = "https://files.pythonhosted.org/packages/2f/ae/3b52634df58cbd506ad804315a1c979ea06942cf88b591dcd671f45adf63/botocore-1.38.25-py3-none-any.whl", hash = "sha256:5a960bd990a11cdb78865e908a58ed712d87d9b419f55ad21c99d7d21f0d6726", size = 13574906, upload-time = "2025-05-28T19:26:31.029Z" },
|
| 54 |
+
]
|
| 55 |
+
|
| 56 |
+
[[package]]
|
| 57 |
+
name = "certifi"
|
| 58 |
+
version = "2025.4.26"
|
| 59 |
+
source = { registry = "https://pypi.org/simple" }
|
| 60 |
+
sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705, upload-time = "2025-04-26T02:12:29.51Z" }
|
| 61 |
+
wheels = [
|
| 62 |
+
{ url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618, upload-time = "2025-04-26T02:12:27.662Z" },
|
| 63 |
+
]
|
| 64 |
+
|
| 65 |
+
[[package]]
|
| 66 |
+
name = "click"
|
| 67 |
+
version = "8.2.1"
|
| 68 |
+
source = { registry = "https://pypi.org/simple" }
|
| 69 |
+
dependencies = [
|
| 70 |
+
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
| 71 |
+
]
|
| 72 |
+
sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" }
|
| 73 |
+
wheels = [
|
| 74 |
+
{ url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" },
|
| 75 |
+
]
|
| 76 |
+
|
| 77 |
+
[[package]]
|
| 78 |
+
name = "colorama"
|
| 79 |
+
version = "0.4.6"
|
| 80 |
+
source = { registry = "https://pypi.org/simple" }
|
| 81 |
+
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
|
| 82 |
+
wheels = [
|
| 83 |
+
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
|
| 84 |
+
]
|
| 85 |
+
|
| 86 |
+
[[package]]
|
| 87 |
+
name = "h11"
|
| 88 |
+
version = "0.16.0"
|
| 89 |
+
source = { registry = "https://pypi.org/simple" }
|
| 90 |
+
sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" }
|
| 91 |
+
wheels = [
|
| 92 |
+
{ url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
|
| 93 |
+
]
|
| 94 |
+
|
| 95 |
+
[[package]]
|
| 96 |
+
name = "httpcore"
|
| 97 |
+
version = "1.0.9"
|
| 98 |
+
source = { registry = "https://pypi.org/simple" }
|
| 99 |
+
dependencies = [
|
| 100 |
+
{ name = "certifi" },
|
| 101 |
+
{ name = "h11" },
|
| 102 |
+
]
|
| 103 |
+
sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" }
|
| 104 |
+
wheels = [
|
| 105 |
+
{ url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" },
|
| 106 |
+
]
|
| 107 |
+
|
| 108 |
+
[[package]]
|
| 109 |
+
name = "httpx"
|
| 110 |
+
version = "0.28.1"
|
| 111 |
+
source = { registry = "https://pypi.org/simple" }
|
| 112 |
+
dependencies = [
|
| 113 |
+
{ name = "anyio" },
|
| 114 |
+
{ name = "certifi" },
|
| 115 |
+
{ name = "httpcore" },
|
| 116 |
+
{ name = "idna" },
|
| 117 |
+
]
|
| 118 |
+
sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" }
|
| 119 |
+
wheels = [
|
| 120 |
+
{ url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
|
| 121 |
+
]
|
| 122 |
+
|
| 123 |
+
[[package]]
|
| 124 |
+
name = "httpx-sse"
|
| 125 |
+
version = "0.4.0"
|
| 126 |
+
source = { registry = "https://pypi.org/simple" }
|
| 127 |
+
sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624, upload-time = "2023-12-22T08:01:21.083Z" }
|
| 128 |
+
wheels = [
|
| 129 |
+
{ url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819, upload-time = "2023-12-22T08:01:19.89Z" },
|
| 130 |
+
]
|
| 131 |
+
|
| 132 |
+
[[package]]
|
| 133 |
+
name = "idna"
|
| 134 |
+
version = "3.10"
|
| 135 |
+
source = { registry = "https://pypi.org/simple" }
|
| 136 |
+
sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" }
|
| 137 |
+
wheels = [
|
| 138 |
+
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" },
|
| 139 |
+
]
|
| 140 |
+
|
| 141 |
+
[[package]]
|
| 142 |
+
name = "ifcopenshell"
|
| 143 |
+
version = "0.8.2"
|
| 144 |
+
source = { registry = "https://pypi.org/simple" }
|
| 145 |
+
dependencies = [
|
| 146 |
+
{ name = "isodate" },
|
| 147 |
+
{ name = "lark" },
|
| 148 |
+
{ name = "numpy" },
|
| 149 |
+
{ name = "python-dateutil" },
|
| 150 |
+
{ name = "shapely" },
|
| 151 |
+
{ name = "typing-extensions" },
|
| 152 |
+
]
|
| 153 |
+
wheels = [
|
| 154 |
+
{ url = "https://files.pythonhosted.org/packages/a7/e6/e7778bf4374ca491d94c8b944fa77af1b3d68221fd36f9ddd722541fc76c/ifcopenshell-0.8.2-py310-none-macosx_10_15_x86_64.whl", hash = "sha256:631e6e6ae4bd4c6456b7b56f1702a1de3ac6c385d48731668b2da48bc3414e72", size = 39361095, upload-time = "2025-04-16T06:23:15.81Z" },
|
| 155 |
+
{ url = "https://files.pythonhosted.org/packages/f7/77/1fd8fe242216a86ab53f6c57868b85671002cd6ac4c023b9e4be0ed195ff/ifcopenshell-0.8.2-py310-none-macosx_11_0_arm64.whl", hash = "sha256:23b25f846efe162b77d9d2386262285a467b08e65354e63d99e32d3e5215282f", size = 38593854, upload-time = "2025-04-16T06:23:10.883Z" },
|
| 156 |
+
{ url = "https://files.pythonhosted.org/packages/73/cf/00e85d165908b4f675b52f8b6cf2ae90879fd550566507102f9786fa5e6f/ifcopenshell-0.8.2-py310-none-manylinux_2_31_x86_64.whl", hash = "sha256:9fb12995629c50d8e0e808d3d7605beb01e701882f1588042629a351f08f4e6a", size = 40456366, upload-time = "2025-04-16T06:23:13.823Z" },
|
| 157 |
+
{ url = "https://files.pythonhosted.org/packages/03/0d/bd2f66a79898383e98ac13253847f05d2d42ea9879823f72c2d11a475f29/ifcopenshell-0.8.2-py310-none-win_amd64.whl", hash = "sha256:9ac143337cfacfc7352b8a0db4b705fadf0af49dbe6d362690cdcdfe8c711158", size = 21475922, upload-time = "2025-04-16T06:22:58.023Z" },
|
| 158 |
+
{ url = "https://files.pythonhosted.org/packages/92/8b/910c3d80a3de5aea1e5979097203e1c1dee09c17fcb444afa83d417d6f23/ifcopenshell-0.8.2-py311-none-macosx_10_15_x86_64.whl", hash = "sha256:2fde0802506884d78f4d8c166ac55e3a148d816d236507a01da0aba171dbeace", size = 39361132, upload-time = "2025-04-16T06:23:07.914Z" },
|
| 159 |
+
{ url = "https://files.pythonhosted.org/packages/08/df/dae5961e76311a5cff7c24c4c2a8f5928c66d0372cc8dcc46d8c83e838ae/ifcopenshell-0.8.2-py311-none-macosx_11_0_arm64.whl", hash = "sha256:df793679431d314e11c0b5fcba31f1ddad351d9d3cec2ffbd26e8976228c4cbb", size = 38593857, upload-time = "2025-04-16T06:23:10.689Z" },
|
| 160 |
+
{ url = "https://files.pythonhosted.org/packages/d3/bb/c8cc651f0b563f2782c33752f219d1098e7b6c07c5bd99e4d6ba17ee59a2/ifcopenshell-0.8.2-py311-none-manylinux_2_31_x86_64.whl", hash = "sha256:c0697368e683541375e36a212d2f0f05421fea3a36a58ea505332fafd44ba8b6", size = 40813934, upload-time = "2025-04-16T06:23:13.374Z" },
|
| 161 |
+
{ url = "https://files.pythonhosted.org/packages/8d/c7/bacd24e0ed89a837f1ec88d10cd472d7a9175c5ba40170b0c00f9bce8dc7/ifcopenshell-0.8.2-py311-none-win_amd64.whl", hash = "sha256:67cdb3d7e4718851214574cf68c7bc15ed18d7cd92f7e527ffe4c8bb4b9073d3", size = 21475522, upload-time = "2025-04-16T06:22:58.689Z" },
|
| 162 |
+
{ url = "https://files.pythonhosted.org/packages/f9/a7/3af121098121289cc11f059bc7011df697eb1d0293c7b9bc3f0ec0aefa55/ifcopenshell-0.8.2-py312-none-macosx_10_15_x86_64.whl", hash = "sha256:7e0cdf7d9ee986d416d0ffe2e154386a42aa52717da594b2382af337b2826913", size = 39367753, upload-time = "2025-04-16T06:23:08.627Z" },
|
| 163 |
+
{ url = "https://files.pythonhosted.org/packages/e5/9a/a4d5868f625f3fbbe7c082cf8fd353cc5faf9b2520efeee4fa36d7208917/ifcopenshell-0.8.2-py312-none-macosx_11_0_arm64.whl", hash = "sha256:320b77e6a85270b950ca16c43384e97c539be7ef8487515e2f9b76665a626ce0", size = 38603582, upload-time = "2025-04-16T06:23:05.967Z" },
|
| 164 |
+
{ url = "https://files.pythonhosted.org/packages/a4/d8/326d420b4eea6ca38393fce83fd2e337443f95a4f31bdfb2cbd28824dda7/ifcopenshell-0.8.2-py312-none-manylinux_2_31_x86_64.whl", hash = "sha256:3d7940f7111873847f74e6625d03a1c01c6e6f96bb4a345486ac35d317a37382", size = 41095019, upload-time = "2025-04-16T06:23:17.496Z" },
|
| 165 |
+
{ url = "https://files.pythonhosted.org/packages/37/a9/fa7e4f77a4bc23505388128830d4c037b5297d0af25bca58dedcdaa4acb1/ifcopenshell-0.8.2-py312-none-win_amd64.whl", hash = "sha256:87ba5edd82de05b883d6d43008e9af08300337f8f305a9ab71c8b730048f66a9", size = 21476386, upload-time = "2025-04-16T06:22:56.414Z" },
|
| 166 |
+
{ url = "https://files.pythonhosted.org/packages/fd/e3/4f16b6ce60782db64677b1008f0aed1dfc5dbb840f5d4be0499255dfb055/ifcopenshell-0.8.2-py39-none-macosx_10_15_x86_64.whl", hash = "sha256:6bbbf4a6d57dc731e08761389d22ed9d83d736e89be480cec09de40df93c3d83", size = 39361093, upload-time = "2025-04-16T06:23:11.388Z" },
|
| 167 |
+
{ url = "https://files.pythonhosted.org/packages/f4/c0/822ff4bee6617a1430262287e55094a1aba8e83fee2cf7fe3e52760a7be2/ifcopenshell-0.8.2-py39-none-macosx_11_0_arm64.whl", hash = "sha256:0ad5bc59705d67a54183f381d36869f7a35e19f62285c50d0fd62d4c815cca89", size = 38593849, upload-time = "2025-04-16T06:23:09.006Z" },
|
| 168 |
+
{ url = "https://files.pythonhosted.org/packages/9c/98/f2e6d903d1a4fa9283220dde5edb2d2f82b4273dc297d4b257b2cbf09796/ifcopenshell-0.8.2-py39-none-manylinux_2_31_x86_64.whl", hash = "sha256:a939376f10eb401e65bc4acba1fd96f0d86404775096dfc32784a6233d637b2e", size = 40419778, upload-time = "2025-04-16T06:23:17.726Z" },
|
| 169 |
+
{ url = "https://files.pythonhosted.org/packages/97/74/c6db20b5b66e74bccc371c43f6f2663102394b305eeb2fc3c1723fc03825/ifcopenshell-0.8.2-py39-none-win_amd64.whl", hash = "sha256:de4619dc3a1e4e10e09b465484d722f41a4da09be12dfccf7fe50b84e5aaff45", size = 21478112, upload-time = "2025-04-16T06:23:02.778Z" },
|
| 170 |
+
]
|
| 171 |
+
|
| 172 |
+
[[package]]
|
| 173 |
+
name = "isodate"
|
| 174 |
+
version = "0.7.2"
|
| 175 |
+
source = { registry = "https://pypi.org/simple" }
|
| 176 |
+
sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload-time = "2024-10-08T23:04:11.5Z" }
|
| 177 |
+
wheels = [
|
| 178 |
+
{ url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" },
|
| 179 |
+
]
|
| 180 |
+
|
| 181 |
+
[[package]]
|
| 182 |
+
name = "jmespath"
|
| 183 |
+
version = "1.0.1"
|
| 184 |
+
source = { registry = "https://pypi.org/simple" }
|
| 185 |
+
sdist = { url = "https://files.pythonhosted.org/packages/00/2a/e867e8531cf3e36b41201936b7fa7ba7b5702dbef42922193f05c8976cd6/jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe", size = 25843, upload-time = "2022-06-17T18:00:12.224Z" }
|
| 186 |
+
wheels = [
|
| 187 |
+
{ url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256, upload-time = "2022-06-17T18:00:10.251Z" },
|
| 188 |
+
]
|
| 189 |
+
|
| 190 |
+
[[package]]
|
| 191 |
+
name = "lark"
|
| 192 |
+
version = "1.2.2"
|
| 193 |
+
source = { registry = "https://pypi.org/simple" }
|
| 194 |
+
sdist = { url = "https://files.pythonhosted.org/packages/af/60/bc7622aefb2aee1c0b4ba23c1446d3e30225c8770b38d7aedbfb65ca9d5a/lark-1.2.2.tar.gz", hash = "sha256:ca807d0162cd16cef15a8feecb862d7319e7a09bdb13aef927968e45040fed80", size = 252132, upload-time = "2024-08-13T19:49:00.652Z" }
|
| 195 |
+
wheels = [
|
| 196 |
+
{ url = "https://files.pythonhosted.org/packages/2d/00/d90b10b962b4277f5e64a78b6609968859ff86889f5b898c1a778c06ec00/lark-1.2.2-py3-none-any.whl", hash = "sha256:c2276486b02f0f1b90be155f2c8ba4a8e194d42775786db622faccd652d8e80c", size = 111036, upload-time = "2024-08-13T19:48:58.603Z" },
|
| 197 |
+
]
|
| 198 |
+
|
| 199 |
+
[[package]]
|
| 200 |
+
name = "markdown-it-py"
|
| 201 |
+
version = "3.0.0"
|
| 202 |
+
source = { registry = "https://pypi.org/simple" }
|
| 203 |
+
dependencies = [
|
| 204 |
+
{ name = "mdurl" },
|
| 205 |
+
]
|
| 206 |
+
sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" }
|
| 207 |
+
wheels = [
|
| 208 |
+
{ url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" },
|
| 209 |
+
]
|
| 210 |
+
|
| 211 |
+
[[package]]
|
| 212 |
+
name = "mcp"
|
| 213 |
+
version = "1.9.1"
|
| 214 |
+
source = { registry = "https://pypi.org/simple" }
|
| 215 |
+
dependencies = [
|
| 216 |
+
{ name = "anyio" },
|
| 217 |
+
{ name = "httpx" },
|
| 218 |
+
{ name = "httpx-sse" },
|
| 219 |
+
{ name = "pydantic" },
|
| 220 |
+
{ name = "pydantic-settings" },
|
| 221 |
+
{ name = "python-multipart" },
|
| 222 |
+
{ name = "sse-starlette" },
|
| 223 |
+
{ name = "starlette" },
|
| 224 |
+
{ name = "uvicorn", marker = "sys_platform != 'emscripten'" },
|
| 225 |
+
]
|
| 226 |
+
sdist = { url = "https://files.pythonhosted.org/packages/e7/bc/54aec2c334698cc575ca3b3481eed627125fb66544152fa1af927b1a495c/mcp-1.9.1.tar.gz", hash = "sha256:19879cd6dde3d763297617242888c2f695a95dfa854386a6a68676a646ce75e4", size = 316247, upload-time = "2025-05-22T15:52:21.26Z" }
|
| 227 |
+
wheels = [
|
| 228 |
+
{ url = "https://files.pythonhosted.org/packages/a6/c0/4ac795585a22a0a2d09cd2b1187b0252d2afcdebd01e10a68bbac4d34890/mcp-1.9.1-py3-none-any.whl", hash = "sha256:2900ded8ffafc3c8a7bfcfe8bc5204037e988e753ec398f371663e6a06ecd9a9", size = 130261, upload-time = "2025-05-22T15:52:19.702Z" },
|
| 229 |
+
]
|
| 230 |
+
|
| 231 |
+
[package.optional-dependencies]
|
| 232 |
+
cli = [
|
| 233 |
+
{ name = "python-dotenv" },
|
| 234 |
+
{ name = "typer" },
|
| 235 |
+
]
|
| 236 |
+
|
| 237 |
+
[[package]]
|
| 238 |
+
name = "mcp-ifcopenshell"
|
| 239 |
+
version = "0.1.0"
|
| 240 |
+
source = { editable = "." }
|
| 241 |
+
dependencies = [
|
| 242 |
+
{ name = "boto3" },
|
| 243 |
+
{ name = "ifcopenshell" },
|
| 244 |
+
{ name = "mcp", extra = ["cli"] },
|
| 245 |
+
]
|
| 246 |
+
|
| 247 |
+
[package.metadata]
|
| 248 |
+
requires-dist = [
|
| 249 |
+
{ name = "boto3", specifier = ">=1.38.25" },
|
| 250 |
+
{ name = "ifcopenshell", specifier = ">=0.8.2" },
|
| 251 |
+
{ name = "mcp", extras = ["cli"], specifier = ">=1.9.1" },
|
| 252 |
+
]
|
| 253 |
+
|
| 254 |
+
[[package]]
|
| 255 |
+
name = "mdurl"
|
| 256 |
+
version = "0.1.2"
|
| 257 |
+
source = { registry = "https://pypi.org/simple" }
|
| 258 |
+
sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
|
| 259 |
+
wheels = [
|
| 260 |
+
{ url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
|
| 261 |
+
]
|
| 262 |
+
|
| 263 |
+
[[package]]
|
| 264 |
+
name = "numpy"
|
| 265 |
+
version = "2.2.6"
|
| 266 |
+
source = { registry = "https://pypi.org/simple" }
|
| 267 |
+
sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" }
|
| 268 |
+
wheels = [
|
| 269 |
+
{ url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" },
|
| 270 |
+
{ url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" },
|
| 271 |
+
{ url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" },
|
| 272 |
+
{ url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" },
|
| 273 |
+
{ url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" },
|
| 274 |
+
{ url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" },
|
| 275 |
+
{ url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" },
|
| 276 |
+
{ url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" },
|
| 277 |
+
{ url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" },
|
| 278 |
+
{ url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" },
|
| 279 |
+
{ url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" },
|
| 280 |
+
{ url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" },
|
| 281 |
+
{ url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" },
|
| 282 |
+
{ url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" },
|
| 283 |
+
{ url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" },
|
| 284 |
+
{ url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" },
|
| 285 |
+
{ url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" },
|
| 286 |
+
{ url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" },
|
| 287 |
+
{ url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" },
|
| 288 |
+
{ url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" },
|
| 289 |
+
{ url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" },
|
| 290 |
+
{ url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" },
|
| 291 |
+
{ url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" },
|
| 292 |
+
{ url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" },
|
| 293 |
+
{ url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" },
|
| 294 |
+
{ url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" },
|
| 295 |
+
{ url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" },
|
| 296 |
+
{ url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" },
|
| 297 |
+
{ url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" },
|
| 298 |
+
{ url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" },
|
| 299 |
+
]
|
| 300 |
+
|
| 301 |
+
[[package]]
|
| 302 |
+
name = "pydantic"
|
| 303 |
+
version = "2.11.5"
|
| 304 |
+
source = { registry = "https://pypi.org/simple" }
|
| 305 |
+
dependencies = [
|
| 306 |
+
{ name = "annotated-types" },
|
| 307 |
+
{ name = "pydantic-core" },
|
| 308 |
+
{ name = "typing-extensions" },
|
| 309 |
+
{ name = "typing-inspection" },
|
| 310 |
+
]
|
| 311 |
+
sdist = { url = "https://files.pythonhosted.org/packages/f0/86/8ce9040065e8f924d642c58e4a344e33163a07f6b57f836d0d734e0ad3fb/pydantic-2.11.5.tar.gz", hash = "sha256:7f853db3d0ce78ce8bbb148c401c2cdd6431b3473c0cdff2755c7690952a7b7a", size = 787102, upload-time = "2025-05-22T21:18:08.761Z" }
|
| 312 |
+
wheels = [
|
| 313 |
+
{ url = "https://files.pythonhosted.org/packages/b5/69/831ed22b38ff9b4b64b66569f0e5b7b97cf3638346eb95a2147fdb49ad5f/pydantic-2.11.5-py3-none-any.whl", hash = "sha256:f9c26ba06f9747749ca1e5c94d6a85cb84254577553c8785576fd38fa64dc0f7", size = 444229, upload-time = "2025-05-22T21:18:06.329Z" },
|
| 314 |
+
]
|
| 315 |
+
|
| 316 |
+
[[package]]
|
| 317 |
+
name = "pydantic-core"
|
| 318 |
+
version = "2.33.2"
|
| 319 |
+
source = { registry = "https://pypi.org/simple" }
|
| 320 |
+
dependencies = [
|
| 321 |
+
{ name = "typing-extensions" },
|
| 322 |
+
]
|
| 323 |
+
sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" }
|
| 324 |
+
wheels = [
|
| 325 |
+
{ url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" },
|
| 326 |
+
{ url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" },
|
| 327 |
+
{ url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" },
|
| 328 |
+
{ url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" },
|
| 329 |
+
{ url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" },
|
| 330 |
+
{ url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" },
|
| 331 |
+
{ url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" },
|
| 332 |
+
{ url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" },
|
| 333 |
+
{ url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" },
|
| 334 |
+
{ url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" },
|
| 335 |
+
{ url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" },
|
| 336 |
+
{ url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" },
|
| 337 |
+
{ url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" },
|
| 338 |
+
{ url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" },
|
| 339 |
+
{ url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" },
|
| 340 |
+
{ url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" },
|
| 341 |
+
{ url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" },
|
| 342 |
+
{ url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" },
|
| 343 |
+
{ url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" },
|
| 344 |
+
{ url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" },
|
| 345 |
+
{ url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" },
|
| 346 |
+
{ url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" },
|
| 347 |
+
{ url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" },
|
| 348 |
+
{ url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" },
|
| 349 |
+
{ url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" },
|
| 350 |
+
{ url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" },
|
| 351 |
+
{ url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" },
|
| 352 |
+
{ url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" },
|
| 353 |
+
{ url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" },
|
| 354 |
+
{ url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" },
|
| 355 |
+
{ url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" },
|
| 356 |
+
]
|
| 357 |
+
|
| 358 |
+
[[package]]
|
| 359 |
+
name = "pydantic-settings"
|
| 360 |
+
version = "2.9.1"
|
| 361 |
+
source = { registry = "https://pypi.org/simple" }
|
| 362 |
+
dependencies = [
|
| 363 |
+
{ name = "pydantic" },
|
| 364 |
+
{ name = "python-dotenv" },
|
| 365 |
+
{ name = "typing-inspection" },
|
| 366 |
+
]
|
| 367 |
+
sdist = { url = "https://files.pythonhosted.org/packages/67/1d/42628a2c33e93f8e9acbde0d5d735fa0850f3e6a2f8cb1eb6c40b9a732ac/pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268", size = 163234, upload-time = "2025-04-18T16:44:48.265Z" }
|
| 368 |
+
wheels = [
|
| 369 |
+
{ url = "https://files.pythonhosted.org/packages/b6/5f/d6d641b490fd3ec2c4c13b4244d68deea3a1b970a97be64f34fb5504ff72/pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef", size = 44356, upload-time = "2025-04-18T16:44:46.617Z" },
|
| 370 |
+
]
|
| 371 |
+
|
| 372 |
+
[[package]]
|
| 373 |
+
name = "pygments"
|
| 374 |
+
version = "2.19.1"
|
| 375 |
+
source = { registry = "https://pypi.org/simple" }
|
| 376 |
+
sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload-time = "2025-01-06T17:26:30.443Z" }
|
| 377 |
+
wheels = [
|
| 378 |
+
{ url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload-time = "2025-01-06T17:26:25.553Z" },
|
| 379 |
+
]
|
| 380 |
+
|
| 381 |
+
[[package]]
|
| 382 |
+
name = "python-dateutil"
|
| 383 |
+
version = "2.9.0.post0"
|
| 384 |
+
source = { registry = "https://pypi.org/simple" }
|
| 385 |
+
dependencies = [
|
| 386 |
+
{ name = "six" },
|
| 387 |
+
]
|
| 388 |
+
sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" }
|
| 389 |
+
wheels = [
|
| 390 |
+
{ url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
|
| 391 |
+
]
|
| 392 |
+
|
| 393 |
+
[[package]]
|
| 394 |
+
name = "python-dotenv"
|
| 395 |
+
version = "1.1.0"
|
| 396 |
+
source = { registry = "https://pypi.org/simple" }
|
| 397 |
+
sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920, upload-time = "2025-03-25T10:14:56.835Z" }
|
| 398 |
+
wheels = [
|
| 399 |
+
{ url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256, upload-time = "2025-03-25T10:14:55.034Z" },
|
| 400 |
+
]
|
| 401 |
+
|
| 402 |
+
[[package]]
|
| 403 |
+
name = "python-multipart"
|
| 404 |
+
version = "0.0.20"
|
| 405 |
+
source = { registry = "https://pypi.org/simple" }
|
| 406 |
+
sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload-time = "2024-12-16T19:45:46.972Z" }
|
| 407 |
+
wheels = [
|
| 408 |
+
{ url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" },
|
| 409 |
+
]
|
| 410 |
+
|
| 411 |
+
[[package]]
|
| 412 |
+
name = "rich"
|
| 413 |
+
version = "14.0.0"
|
| 414 |
+
source = { registry = "https://pypi.org/simple" }
|
| 415 |
+
dependencies = [
|
| 416 |
+
{ name = "markdown-it-py" },
|
| 417 |
+
{ name = "pygments" },
|
| 418 |
+
]
|
| 419 |
+
sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload-time = "2025-03-30T14:15:14.23Z" }
|
| 420 |
+
wheels = [
|
| 421 |
+
{ url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload-time = "2025-03-30T14:15:12.283Z" },
|
| 422 |
+
]
|
| 423 |
+
|
| 424 |
+
[[package]]
|
| 425 |
+
name = "s3transfer"
|
| 426 |
+
version = "0.13.0"
|
| 427 |
+
source = { registry = "https://pypi.org/simple" }
|
| 428 |
+
dependencies = [
|
| 429 |
+
{ name = "botocore" },
|
| 430 |
+
]
|
| 431 |
+
sdist = { url = "https://files.pythonhosted.org/packages/ed/5d/9dcc100abc6711e8247af5aa561fc07c4a046f72f659c3adea9a449e191a/s3transfer-0.13.0.tar.gz", hash = "sha256:f5e6db74eb7776a37208001113ea7aa97695368242b364d73e91c981ac522177", size = 150232, upload-time = "2025-05-22T19:24:50.245Z" }
|
| 432 |
+
wheels = [
|
| 433 |
+
{ url = "https://files.pythonhosted.org/packages/18/17/22bf8155aa0ea2305eefa3a6402e040df7ebe512d1310165eda1e233c3f8/s3transfer-0.13.0-py3-none-any.whl", hash = "sha256:0148ef34d6dd964d0d8cf4311b2b21c474693e57c2e069ec708ce043d2b527be", size = 85152, upload-time = "2025-05-22T19:24:48.703Z" },
|
| 434 |
+
]
|
| 435 |
+
|
| 436 |
+
[[package]]
|
| 437 |
+
name = "shapely"
|
| 438 |
+
version = "2.1.1"
|
| 439 |
+
source = { registry = "https://pypi.org/simple" }
|
| 440 |
+
dependencies = [
|
| 441 |
+
{ name = "numpy" },
|
| 442 |
+
]
|
| 443 |
+
sdist = { url = "https://files.pythonhosted.org/packages/ca/3c/2da625233f4e605155926566c0e7ea8dda361877f48e8b1655e53456f252/shapely-2.1.1.tar.gz", hash = "sha256:500621967f2ffe9642454808009044c21e5b35db89ce69f8a2042c2ffd0e2772", size = 315422, upload-time = "2025-05-19T11:04:41.265Z" }
|
| 444 |
+
wheels = [
|
| 445 |
+
{ url = "https://files.pythonhosted.org/packages/fb/64/9544dc07dfe80a2d489060791300827c941c451e2910f7364b19607ea352/shapely-2.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2827365b58bf98efb60affc94a8e01c56dd1995a80aabe4b701465d86dcbba43", size = 1833021, upload-time = "2025-05-19T11:04:08.022Z" },
|
| 446 |
+
{ url = "https://files.pythonhosted.org/packages/07/aa/fb5f545e72e89b6a0f04a0effda144f5be956c9c312c7d4e00dfddbddbcf/shapely-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9c551f7fa7f1e917af2347fe983f21f212863f1d04f08eece01e9c275903fad", size = 1643018, upload-time = "2025-05-19T11:04:09.343Z" },
|
| 447 |
+
{ url = "https://files.pythonhosted.org/packages/03/46/61e03edba81de729f09d880ce7ae5c1af873a0814206bbfb4402ab5c3388/shapely-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78dec4d4fbe7b1db8dc36de3031767e7ece5911fb7782bc9e95c5cdec58fb1e9", size = 2986417, upload-time = "2025-05-19T11:04:10.56Z" },
|
| 448 |
+
{ url = "https://files.pythonhosted.org/packages/1f/1e/83ec268ab8254a446b4178b45616ab5822d7b9d2b7eb6e27cf0b82f45601/shapely-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:872d3c0a7b8b37da0e23d80496ec5973c4692920b90de9f502b5beb994bbaaef", size = 3098224, upload-time = "2025-05-19T11:04:11.903Z" },
|
| 449 |
+
{ url = "https://files.pythonhosted.org/packages/f1/44/0c21e7717c243e067c9ef8fa9126de24239f8345a5bba9280f7bb9935959/shapely-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2e2b9125ebfbc28ecf5353511de62f75a8515ae9470521c9a693e4bb9fbe0cf1", size = 3925982, upload-time = "2025-05-19T11:04:13.224Z" },
|
| 450 |
+
{ url = "https://files.pythonhosted.org/packages/15/50/d3b4e15fefc103a0eb13d83bad5f65cd6e07a5d8b2ae920e767932a247d1/shapely-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4b96cea171b3d7f6786976a0520f178c42792897653ecca0c5422fb1e6946e6d", size = 4089122, upload-time = "2025-05-19T11:04:14.477Z" },
|
| 451 |
+
{ url = "https://files.pythonhosted.org/packages/bd/05/9a68f27fc6110baeedeeebc14fd86e73fa38738c5b741302408fb6355577/shapely-2.1.1-cp312-cp312-win32.whl", hash = "sha256:39dca52201e02996df02e447f729da97cfb6ff41a03cb50f5547f19d02905af8", size = 1522437, upload-time = "2025-05-19T11:04:16.203Z" },
|
| 452 |
+
{ url = "https://files.pythonhosted.org/packages/bc/e9/a4560e12b9338842a1f82c9016d2543eaa084fce30a1ca11991143086b57/shapely-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:13d643256f81d55a50013eff6321142781cf777eb6a9e207c2c9e6315ba6044a", size = 1703479, upload-time = "2025-05-19T11:04:18.497Z" },
|
| 453 |
+
{ url = "https://files.pythonhosted.org/packages/71/8e/2bc836437f4b84d62efc1faddce0d4e023a5d990bbddd3c78b2004ebc246/shapely-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3004a644d9e89e26c20286d5fdc10f41b1744c48ce910bd1867fdff963fe6c48", size = 1832107, upload-time = "2025-05-19T11:04:19.736Z" },
|
| 454 |
+
{ url = "https://files.pythonhosted.org/packages/12/a2/12c7cae5b62d5d851c2db836eadd0986f63918a91976495861f7c492f4a9/shapely-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1415146fa12d80a47d13cfad5310b3c8b9c2aa8c14a0c845c9d3d75e77cb54f6", size = 1642355, upload-time = "2025-05-19T11:04:21.035Z" },
|
| 455 |
+
{ url = "https://files.pythonhosted.org/packages/5b/7e/6d28b43d53fea56de69c744e34c2b999ed4042f7a811dc1bceb876071c95/shapely-2.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21fcab88b7520820ec16d09d6bea68652ca13993c84dffc6129dc3607c95594c", size = 2968871, upload-time = "2025-05-19T11:04:22.167Z" },
|
| 456 |
+
{ url = "https://files.pythonhosted.org/packages/dd/87/1017c31e52370b2b79e4d29e07cbb590ab9e5e58cf7e2bdfe363765d6251/shapely-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5ce6a5cc52c974b291237a96c08c5592e50f066871704fb5b12be2639d9026a", size = 3080830, upload-time = "2025-05-19T11:04:23.997Z" },
|
| 457 |
+
{ url = "https://files.pythonhosted.org/packages/1d/fe/f4a03d81abd96a6ce31c49cd8aaba970eaaa98e191bd1e4d43041e57ae5a/shapely-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:04e4c12a45a1d70aeb266618d8cf81a2de9c4df511b63e105b90bfdfb52146de", size = 3908961, upload-time = "2025-05-19T11:04:25.702Z" },
|
| 458 |
+
{ url = "https://files.pythonhosted.org/packages/ef/59/7605289a95a6844056a2017ab36d9b0cb9d6a3c3b5317c1f968c193031c9/shapely-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6ca74d851ca5264aae16c2b47e96735579686cb69fa93c4078070a0ec845b8d8", size = 4079623, upload-time = "2025-05-19T11:04:27.171Z" },
|
| 459 |
+
{ url = "https://files.pythonhosted.org/packages/bc/4d/9fea036eff2ef4059d30247128b2d67aaa5f0b25e9fc27e1d15cc1b84704/shapely-2.1.1-cp313-cp313-win32.whl", hash = "sha256:fd9130501bf42ffb7e0695b9ea17a27ae8ce68d50b56b6941c7f9b3d3453bc52", size = 1521916, upload-time = "2025-05-19T11:04:28.405Z" },
|
| 460 |
+
{ url = "https://files.pythonhosted.org/packages/12/d9/6d13b8957a17c95794f0c4dfb65ecd0957e6c7131a56ce18d135c1107a52/shapely-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:ab8d878687b438a2f4c138ed1a80941c6ab0029e0f4c785ecfe114413b498a97", size = 1702746, upload-time = "2025-05-19T11:04:29.643Z" },
|
| 461 |
+
{ url = "https://files.pythonhosted.org/packages/60/36/b1452e3e7f35f5f6454d96f3be6e2bb87082720ff6c9437ecc215fa79be0/shapely-2.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0c062384316a47f776305ed2fa22182717508ffdeb4a56d0ff4087a77b2a0f6d", size = 1833482, upload-time = "2025-05-19T11:04:30.852Z" },
|
| 462 |
+
{ url = "https://files.pythonhosted.org/packages/ce/ca/8e6f59be0718893eb3e478141285796a923636dc8f086f83e5b0ec0036d0/shapely-2.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4ecf6c196b896e8f1360cc219ed4eee1c1e5f5883e505d449f263bd053fb8c05", size = 1642256, upload-time = "2025-05-19T11:04:32.068Z" },
|
| 463 |
+
{ url = "https://files.pythonhosted.org/packages/ab/78/0053aea449bb1d4503999525fec6232f049abcdc8df60d290416110de943/shapely-2.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb00070b4c4860f6743c600285109c273cca5241e970ad56bb87bef0be1ea3a0", size = 3016614, upload-time = "2025-05-19T11:04:33.7Z" },
|
| 464 |
+
{ url = "https://files.pythonhosted.org/packages/ee/53/36f1b1de1dfafd1b457dcbafa785b298ce1b8a3e7026b79619e708a245d5/shapely-2.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d14a9afa5fa980fbe7bf63706fdfb8ff588f638f145a1d9dbc18374b5b7de913", size = 3093542, upload-time = "2025-05-19T11:04:34.952Z" },
|
| 465 |
+
{ url = "https://files.pythonhosted.org/packages/b9/bf/0619f37ceec6b924d84427c88835b61f27f43560239936ff88915c37da19/shapely-2.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b640e390dabde790e3fb947198b466e63223e0a9ccd787da5f07bcb14756c28d", size = 3945961, upload-time = "2025-05-19T11:04:36.32Z" },
|
| 466 |
+
{ url = "https://files.pythonhosted.org/packages/93/c9/20ca4afeb572763b07a7997f00854cb9499df6af85929e93012b189d8917/shapely-2.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:69e08bf9697c1b73ec6aa70437db922bafcea7baca131c90c26d59491a9760f9", size = 4089514, upload-time = "2025-05-19T11:04:37.683Z" },
|
| 467 |
+
{ url = "https://files.pythonhosted.org/packages/33/6a/27036a5a560b80012a544366bceafd491e8abb94a8db14047b5346b5a749/shapely-2.1.1-cp313-cp313t-win32.whl", hash = "sha256:ef2d09d5a964cc90c2c18b03566cf918a61c248596998a0301d5b632beadb9db", size = 1540607, upload-time = "2025-05-19T11:04:38.925Z" },
|
| 468 |
+
{ url = "https://files.pythonhosted.org/packages/ea/f1/5e9b3ba5c7aa7ebfaf269657e728067d16a7c99401c7973ddf5f0cf121bd/shapely-2.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8cb8f17c377260452e9d7720eeaf59082c5f8ea48cf104524d953e5d36d4bdb7", size = 1723061, upload-time = "2025-05-19T11:04:40.082Z" },
|
| 469 |
+
]
|
| 470 |
+
|
| 471 |
+
[[package]]
|
| 472 |
+
name = "shellingham"
|
| 473 |
+
version = "1.5.4"
|
| 474 |
+
source = { registry = "https://pypi.org/simple" }
|
| 475 |
+
sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
|
| 476 |
+
wheels = [
|
| 477 |
+
{ url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
|
| 478 |
+
]
|
| 479 |
+
|
| 480 |
+
[[package]]
|
| 481 |
+
name = "six"
|
| 482 |
+
version = "1.17.0"
|
| 483 |
+
source = { registry = "https://pypi.org/simple" }
|
| 484 |
+
sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
|
| 485 |
+
wheels = [
|
| 486 |
+
{ url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
|
| 487 |
+
]
|
| 488 |
+
|
| 489 |
+
[[package]]
|
| 490 |
+
name = "sniffio"
|
| 491 |
+
version = "1.3.1"
|
| 492 |
+
source = { registry = "https://pypi.org/simple" }
|
| 493 |
+
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" }
|
| 494 |
+
wheels = [
|
| 495 |
+
{ 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" },
|
| 496 |
+
]
|
| 497 |
+
|
| 498 |
+
[[package]]
|
| 499 |
+
name = "sse-starlette"
|
| 500 |
+
version = "2.3.5"
|
| 501 |
+
source = { registry = "https://pypi.org/simple" }
|
| 502 |
+
dependencies = [
|
| 503 |
+
{ name = "anyio" },
|
| 504 |
+
{ name = "starlette" },
|
| 505 |
+
]
|
| 506 |
+
sdist = { url = "https://files.pythonhosted.org/packages/10/5f/28f45b1ff14bee871bacafd0a97213f7ec70e389939a80c60c0fb72a9fc9/sse_starlette-2.3.5.tar.gz", hash = "sha256:228357b6e42dcc73a427990e2b4a03c023e2495ecee82e14f07ba15077e334b2", size = 17511, upload-time = "2025-05-12T18:23:52.601Z" }
|
| 507 |
+
wheels = [
|
| 508 |
+
{ url = "https://files.pythonhosted.org/packages/c8/48/3e49cf0f64961656402c0023edbc51844fe17afe53ab50e958a6dbbbd499/sse_starlette-2.3.5-py3-none-any.whl", hash = "sha256:251708539a335570f10eaaa21d1848a10c42ee6dc3a9cf37ef42266cdb1c52a8", size = 10233, upload-time = "2025-05-12T18:23:50.722Z" },
|
| 509 |
+
]
|
| 510 |
+
|
| 511 |
+
[[package]]
|
| 512 |
+
name = "starlette"
|
| 513 |
+
version = "0.46.2"
|
| 514 |
+
source = { registry = "https://pypi.org/simple" }
|
| 515 |
+
dependencies = [
|
| 516 |
+
{ name = "anyio" },
|
| 517 |
+
]
|
| 518 |
+
sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846, upload-time = "2025-04-13T13:56:17.942Z" }
|
| 519 |
+
wheels = [
|
| 520 |
+
{ url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037, upload-time = "2025-04-13T13:56:16.21Z" },
|
| 521 |
+
]
|
| 522 |
+
|
| 523 |
+
[[package]]
|
| 524 |
+
name = "typer"
|
| 525 |
+
version = "0.16.0"
|
| 526 |
+
source = { registry = "https://pypi.org/simple" }
|
| 527 |
+
dependencies = [
|
| 528 |
+
{ name = "click" },
|
| 529 |
+
{ name = "rich" },
|
| 530 |
+
{ name = "shellingham" },
|
| 531 |
+
{ name = "typing-extensions" },
|
| 532 |
+
]
|
| 533 |
+
sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625, upload-time = "2025-05-26T14:30:31.824Z" }
|
| 534 |
+
wheels = [
|
| 535 |
+
{ url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317, upload-time = "2025-05-26T14:30:30.523Z" },
|
| 536 |
+
]
|
| 537 |
+
|
| 538 |
+
[[package]]
|
| 539 |
+
name = "typing-extensions"
|
| 540 |
+
version = "4.13.2"
|
| 541 |
+
source = { registry = "https://pypi.org/simple" }
|
| 542 |
+
sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" }
|
| 543 |
+
wheels = [
|
| 544 |
+
{ url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" },
|
| 545 |
+
]
|
| 546 |
+
|
| 547 |
+
[[package]]
|
| 548 |
+
name = "typing-inspection"
|
| 549 |
+
version = "0.4.1"
|
| 550 |
+
source = { registry = "https://pypi.org/simple" }
|
| 551 |
+
dependencies = [
|
| 552 |
+
{ name = "typing-extensions" },
|
| 553 |
+
]
|
| 554 |
+
sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" }
|
| 555 |
+
wheels = [
|
| 556 |
+
{ url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" },
|
| 557 |
+
]
|
| 558 |
+
|
| 559 |
+
[[package]]
|
| 560 |
+
name = "urllib3"
|
| 561 |
+
version = "2.4.0"
|
| 562 |
+
source = { registry = "https://pypi.org/simple" }
|
| 563 |
+
sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672, upload-time = "2025-04-10T15:23:39.232Z" }
|
| 564 |
+
wheels = [
|
| 565 |
+
{ url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680, upload-time = "2025-04-10T15:23:37.377Z" },
|
| 566 |
+
]
|
| 567 |
+
|
| 568 |
+
[[package]]
|
| 569 |
+
name = "uvicorn"
|
| 570 |
+
version = "0.34.2"
|
| 571 |
+
source = { registry = "https://pypi.org/simple" }
|
| 572 |
+
dependencies = [
|
| 573 |
+
{ name = "click" },
|
| 574 |
+
{ name = "h11" },
|
| 575 |
+
]
|
| 576 |
+
sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815, upload-time = "2025-04-19T06:02:50.101Z" }
|
| 577 |
+
wheels = [
|
| 578 |
+
{ url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483, upload-time = "2025-04-19T06:02:48.42Z" },
|
| 579 |
+
]
|