From 33731c235316d0412a3fc0b3160aa57467325062 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Fri, 7 Jul 2023 09:22:51 -0700 Subject: [PATCH 001/140] Adding experimental module. --- tds/modules/experimental/__init__.py | 10 +++ tds/modules/experimental/controller.py | 108 +++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 tds/modules/experimental/__init__.py create mode 100644 tds/modules/experimental/controller.py diff --git a/tds/modules/experimental/__init__.py b/tds/modules/experimental/__init__.py new file mode 100644 index 000000000..797757cea --- /dev/null +++ b/tds/modules/experimental/__init__.py @@ -0,0 +1,10 @@ +""" + TDS Experimental Module. + + A simple REST module that creates the basic endpoints for an entity in + Terarium Data Service (TDS). +""" +from tds.modules.experimental.controller import experimental_router as router + +ROUTE_PREFIX = "experimental" +TAGS = ["Experimental"] diff --git a/tds/modules/experimental/controller.py b/tds/modules/experimental/controller.py new file mode 100644 index 000000000..c0a7ed423 --- /dev/null +++ b/tds/modules/experimental/controller.py @@ -0,0 +1,108 @@ +""" + TDS Experimental Controller. + + Description: Defines the basic rest endpoints for the TDS Module. +""" +import re +from logging import Logger + +import openai +from fastapi import APIRouter, Depends +from sqlalchemy.engine.base import Engine + +from tds.db.graph.neo4j import request_engine as request_graph_db +from tds.db.relational import request_engine as request_rdb +from tds.modules.provenance.utils import return_graph_validations +from tds.settings import settings + +experimental_router = APIRouter() +logger = Logger(__name__) +valid_relations = return_graph_validations() + +DB_DESC = "Valid relations include:\n" +# NOTE: Should we make these sentences more natural language related? +for relation, mapping in valid_relations.items(): + for dom, codom in mapping: + DB_DESC += f"{dom}-[relation]->{codom}\n" + +PREAMBLE = """ +I will type "Question:" followed by a question or command in English like "Question: Count all Publications" and you will return a +single line print "Query:" Followed by an openCypher query like "Query: `match (p:Publication) return count(p)`. +""" + +EXAMPLES = """ +Question: Match all nodes in the database +Query: `Match (n) return n` + +Question: Which composed models are derived from Paper with ID of 12? +Query: `Match (m:Model)-[r *1..]->(i:Intermediate)-[r2:EXTRACTED_FROM]->(p:Publication) where p.id=12 return m` + +Question: Which datasets are associated with which model primitives? +Query: `match (d:Dataset)-[r *1..]-(i:Intermediate) return d,r,i` + +Question: Return simulators that rely on Primitive with ID of 19 or 12 +Query: `match (p:Plan)-[r *1..]->(i:Intermediate) where i.id=19 or i.id=12 return p,r,i` + +Question: Which simulators were created by User with ID 999? +Query: `match (p:Plan)-[r:USES]->(mr:ModelRevision) where r.user_id=999 return p` + +Question: What are prior versions of this composed model with id 5? +Query: `Match (rev:ModelRevision)<-[r:BEGINS_AT]-(m:Model) where (m.id=5) match (rev2:ModelRevision)<-[r2 *1.. ]-(rev) return rev,rev2` +""" + + +@experimental_router.get("/cql") +def convert_to_cypher( + query: str, +) -> str: + """ + Convert English to Cypher. + """ + user_query = f"Question: {query}\nQuery: " + prompt = PREAMBLE + DB_DESC + "\n" + EXAMPLES + "\n" + user_query + completion = openai.Completion.create( + engine="text-davinci-003", + prompt=prompt, + max_tokens=64, + api_key=settings.OPENAI_KEY, + ) + response = completion.choices[0].text + matched_expression = re.compile(r"`([^`]*)`").fullmatch(response.strip()) + if matched_expression is None: + raise Exception("OpenAI did not generate a valid response") + cypher: str = matched_expression.groups(1)[0] + logger.info("converted '%s' TO `%s`", query, cypher) + return cypher + + +@experimental_router.get("/provenance") +def search_provenance( + query: str, + # rdb: Engine = Depends(request_rdb), + # graph_db=Depends(request_graph_db), +) -> str: + """ + Convert English to Cypher. + """ + # cypher = convert_to_cypher(query) + raise NotImplementedError + + +@experimental_router.get("/set_properties") +def set_properties( + rdb: Engine = Depends(request_rdb), + graph_db=Depends(request_graph_db), +) -> bool: + """ + Modify DB contents to work with Neoviz + """ + # Importing ProvenanceHandler here to bypass circular import issue. + # pylint: disable-next=import-outside-toplevel + from tds.db.graph.provenance_handler import ProvenanceHandler + + if settings.NEO4J_ENABLED: + print("Neo4j is set") + provenance_handler = ProvenanceHandler(rdb=rdb, graph_db=graph_db) + success = provenance_handler.add_properties() + return success + return False From 04d9a16e6bdf7522914306eadb377f991d8a44fe Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Fri, 7 Jul 2023 09:23:08 -0700 Subject: [PATCH 002/140] Removing experimental router. --- tds/routers/experimental.py | 105 ------------------------------------ 1 file changed, 105 deletions(-) delete mode 100644 tds/routers/experimental.py diff --git a/tds/routers/experimental.py b/tds/routers/experimental.py deleted file mode 100644 index edc6c08e9..000000000 --- a/tds/routers/experimental.py +++ /dev/null @@ -1,105 +0,0 @@ -""" -Experimental provenance search -""" - -import re -from logging import Logger - -import openai -from fastapi import APIRouter, Depends -from sqlalchemy.engine.base import Engine - -from tds.db import request_graph_db, request_rdb -from tds.db.graph.provenance_handler import ProvenanceHandler -from tds.modules.provenance.utils import return_graph_validations -from tds.settings import settings - -logger = Logger(__name__) -router = APIRouter() - - -valid_relations = return_graph_validations() - -DB_DESC = "Valid relations include:\n" -# NOTE: Should we make these sentences more natural language related? -for relation, mapping in valid_relations.items(): - for dom, codom in mapping: - DB_DESC += f"{dom}-[relation]->{codom}\n" - -PREAMBLE = """ -I will type "Question:" followed by a question or command in English like "Question: Count all Publications" and you will return a -single line print "Query:" Followed by an openCypher query like "Query: `match (p:Publication) return count(p)`. -""" - -EXAMPLES = """ -Question: Match all nodes in the database -Query: `Match (n) return n` - -Question: Which composed models are derived from Paper with ID of 12? -Query: `Match (m:Model)-[r *1..]->(i:Intermediate)-[r2:EXTRACTED_FROM]->(p:Publication) where p.id=12 return m` - -Question: Which datasets are associated with which model primitives? -Query: `match (d:Dataset)-[r *1..]-(i:Intermediate) return d,r,i` - -Question: Return simulators that rely on Primitive with ID of 19 or 12 -Query: `match (p:Plan)-[r *1..]->(i:Intermediate) where i.id=19 or i.id=12 return p,r,i` - -Question: Which simulators were created by User with ID 999? -Query: `match (p:Plan)-[r:USES]->(mr:ModelRevision) where r.user_id=999 return p` - -Question: What are prior versions of this composed model with id 5? -Query: `Match (rev:ModelRevision)<-[r:BEGINS_AT]-(m:Model) where (m.id=5) match (rev2:ModelRevision)<-[r2 *1.. ]-(rev) return rev,rev2` -""" - - -@router.get("/cql") -def convert_to_cypher( - query: str, -) -> str: - """ - Convert English to Cypher. - """ - user_query = f"Question: {query}\nQuery: " - prompt = PREAMBLE + DB_DESC + "\n" + EXAMPLES + "\n" + user_query - completion = openai.Completion.create( - engine="text-davinci-003", - prompt=prompt, - max_tokens=64, - api_key=settings.OPENAI_KEY, - ) - response = completion.choices[0].text - matched_expression = re.compile(r"`([^`]*)`").fullmatch(response.strip()) - if matched_expression is None: - raise Exception("OpenAI did not generate a valid response") - cypher: str = matched_expression.groups(1)[0] - logger.info("converted '%s' TO `%s`", query, cypher) - return cypher - - -@router.get("/provenance") -def search_provenance( - query: str, - # rdb: Engine = Depends(request_rdb), - # graph_db=Depends(request_graph_db), -) -> str: - """ - Convert English to Cypher. - """ - # cypher = convert_to_cypher(query) - raise NotImplementedError - - -@router.get("/set_properties") -def set_properties( - rdb: Engine = Depends(request_rdb), - graph_db=Depends(request_graph_db), -) -> bool: - """ - Modify DB contents to work with Neoviz - """ - if settings.NEO4J_ENABLED: - print("Neo4j is set") - provenance_handler = ProvenanceHandler(rdb=rdb, graph_db=graph_db) - success = provenance_handler.add_properties() - return success - return False From a5e6412ae37a6568b856d4f85b05aa0761720605 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 11 Jul 2023 05:59:44 -0700 Subject: [PATCH 003/140] Removed project from autogen orm. --- tds/autogen/orm.py | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/tds/autogen/orm.py b/tds/autogen/orm.py index 8fda9152c..b43bbf581 100644 --- a/tds/autogen/orm.py +++ b/tds/autogen/orm.py @@ -68,16 +68,6 @@ class Extraction(Base): img = sa.Column(sa.LargeBinary(), nullable=False) -class ProjectAsset(Base): - __tablename__ = "project_asset" - - id = sa.Column(sa.Integer(), primary_key=True) - project_id = sa.Column(sa.Integer(), sa.ForeignKey("project.id"), nullable=False) - resource_id = sa.Column(sa.String(), nullable=False) - resource_type = sa.Column(sa.Enum(ResourceType), nullable=False) - external_ref = sa.Column(sa.String()) - - class Association(Base): __tablename__ = "association" @@ -114,17 +104,6 @@ class Publication(Base): title = sa.Column(sa.String(), nullable=False) -class Project(Base): - __tablename__ = "project" - - id = sa.Column(sa.Integer(), primary_key=True) - name = sa.Column(sa.String(), nullable=False) - description = sa.Column(sa.String(), nullable=False) - timestamp = sa.Column(sa.DateTime(), server_default=func.now()) - active = sa.Column(sa.Boolean(), nullable=False) - username = sa.Column(sa.String()) - - class Person(Base): __tablename__ = "person" From bab4cb0498212acd7cace3ebc18464dfca708bee Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 11 Jul 2023 06:00:12 -0700 Subject: [PATCH 004/140] Removed project from autogen schema. --- tds/autogen/schema.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/tds/autogen/schema.py b/tds/autogen/schema.py index b5382be48..3f73c54ed 100644 --- a/tds/autogen/schema.py +++ b/tds/autogen/schema.py @@ -60,14 +60,6 @@ class Extraction(BaseModel): img: bytes -class ProjectAsset(BaseModel): - id: Optional[int] = None - project_id: Optional[int] = None - resource_id: Optional[int] = None - resource_type: ResourceType - external_ref: Optional[str] - - class OntologyConcept(BaseModel): id: Optional[int] = None curie: str @@ -116,15 +108,6 @@ class Publication(BaseModel): title: str -class Project(BaseModel): - id: Optional[int] = None - name: str - description: str - timestamp: Optional[datetime.datetime] = datetime.datetime.now() - active: bool - username: Optional[str] - - class Person(BaseModel): id: Optional[int] = None name: str From 37e303ab7d01f634129b167214fab4a1affc0682 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 11 Jul 2023 06:00:44 -0700 Subject: [PATCH 005/140] Updated id to orm_id. --- tds/db/helpers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tds/db/helpers.py b/tds/db/helpers.py index 3a217724f..64e17f636 100644 --- a/tds/db/helpers.py +++ b/tds/db/helpers.py @@ -23,12 +23,12 @@ def drop_content(connection: Connection): return orm.Base.metadata.drop_all(connection) -def entry_exists(connection: Connection, orm_type: Any, id: int) -> bool: +def entry_exists(connection: Connection, orm_type: Any, orm_id: int) -> bool: """ Check if entry exists """ with Session(connection) as session: - return session.query(orm_type).filter(orm_type.id == id).count() == 1 + return session.query(orm_type).filter(orm_type.id == orm_id).count() == 1 def list_by_id(connection: Connection, orm_type: Any, page_size: int, page: int = 0): From d8743416babf60910bba7edbdb3a32bf9c9d135b Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 11 Jul 2023 06:01:04 -0700 Subject: [PATCH 006/140] Added function to convert plural to singular. --- tds/lib/utils.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tds/lib/utils.py b/tds/lib/utils.py index b8061cd42..93d61221c 100644 --- a/tds/lib/utils.py +++ b/tds/lib/utils.py @@ -25,3 +25,12 @@ def patchable(model: BaseModel) -> BaseModel: _PATCHABLE_MODELS[model_name] = PatchableModel return PatchableModel + + +def get_singular_index(index_str: str): + """ + Function strips the s off of an index str. + """ + if index_str[-1] == "s": + return index_str.rstrip(index_str[-1]) + return index_str From e05ded1e742dfb2a7264fe8b5d499ed2e1d16bb4 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 11 Jul 2023 06:01:47 -0700 Subject: [PATCH 007/140] Removing old project router. --- tds/routers/projects.py | 308 ---------------------------------------- 1 file changed, 308 deletions(-) delete mode 100644 tds/routers/projects.py diff --git a/tds/routers/projects.py b/tds/routers/projects.py deleted file mode 100644 index adfc37304..000000000 --- a/tds/routers/projects.py +++ /dev/null @@ -1,308 +0,0 @@ -""" -CRUD operations for projects -""" - -import json -from logging import Logger -from typing import List, Optional - -from fastapi import APIRouter, Depends, HTTPException -from fastapi import Query as FastAPIQuery -from fastapi import Response, status -from sqlalchemy.engine.base import Engine -from sqlalchemy.orm import Query, Session - -from tds.autogen import orm -from tds.db import entry_exists, es_client, list_by_id, request_rdb -from tds.lib.projects import adjust_project_assets, save_project_assets -from tds.modules.artifact.response import artifact_response -from tds.modules.dataset.response import dataset_response -from tds.modules.model.utils import model_list_fields, model_list_response -from tds.modules.model_configuration.response import configuration_response -from tds.modules.simulation.response import simulation_response -from tds.modules.workflow.response import workflow_response -from tds.operation import create, delete, retrieve, update -from tds.schema.project import Project, ProjectMetadata -from tds.schema.resource import ResourceType, get_resource_orm, get_schema_description -from tds.settings import settings - -logger = Logger(__name__) -router = APIRouter() -es = es_client() - -es_list_response = { - ResourceType.models: {"function": model_list_response, "fields": model_list_fields}, - ResourceType.model_configurations: { - "function": configuration_response, - "fields": None, - }, - ResourceType.datasets: {"function": dataset_response, "fields": None}, - ResourceType.simulations: {"fields": None, "function": simulation_response}, - ResourceType.workflows: {"fields": None, "function": workflow_response}, - ResourceType.artifacts: {"fields": None, "function": artifact_response}, -} - -es_resources = [ - ResourceType.datasets, - ResourceType.models, - ResourceType.model_configurations, - ResourceType.simulations, - ResourceType.workflows, - ResourceType.artifacts, -] - - -@router.get("") -def list_projects( - page_size: int = 50, page: int = 0, rdb: Engine = Depends(request_rdb) -) -> List[ProjectMetadata]: - """ - Retrieve all projects - """ - return list_by_id(rdb.connect(), orm.Project, page_size, page) - - -@router.get("/{id}", **retrieve.fastapi_endpoint_config) -def get_project(id: int, rdb: Engine = Depends(request_rdb)) -> Project: - """ - Retrieve project - """ - if entry_exists(rdb.connect(), orm.Project, id): - with Session(rdb) as session: - project = session.query(orm.Project).get(id) - parameters: Query[orm.ProjectAsset] = session.query( - orm.ProjectAsset - ).filter(orm.ProjectAsset.project_id == id) - else: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) - return Project.from_orm(project, list(parameters)) - - -@router.delete("/{id}", **retrieve.fastapi_endpoint_config) -def deactivate_project(id: int, rdb: Engine = Depends(request_rdb)) -> Project: - """ - Deactivate project - """ - if entry_exists(rdb.connect(), orm.Project, id): - with Session(rdb) as session: - project = session.query(orm.Project).get(id) - - # set to dict and active to false - project_ = project.__dict__ - project_.pop("_sa_instance_state") - project_["active"] = False - - with Session(rdb) as session: - session.query(orm.Project).filter(orm.Project.id == id).update(project_) - session.commit() - - else: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) - return Response( - headers={ - "content-type": "application/json", - }, - content=json.dumps({"id": id, "status": project_["active"]}), - ) - - -@router.post("", **create.fastapi_endpoint_config) -def create_project(payload: Project, rdb: Engine = Depends(request_rdb)) -> Response: - """ - Create project and return its ID - """ - with Session(rdb) as session: - project_payload = payload.dict() - # pylint: disable-next=unused-variable - concept_payload = project_payload.pop("concept") # TODO: Save ontology term - assets = project_payload.pop("assets") - for resource_type in assets: - current_orm = get_resource_orm(resource_type) - if not all( - ( - entry_exists(rdb.connect(), current_orm, id) - for id in assets[resource_type] - ) - ): - raise HTTPException( - status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, - detail="Not all listed assets exist.", - ) - project = orm.Project(**project_payload) - session.add(project) - session.commit() - id: int = project.id - save_project_assets(id, assets, session) - session.commit() - logger.info("new project created: %i", id) - return Response( - status_code=status.HTTP_201_CREATED, - headers={ - "location": f"/api/projects/{id}", - "content-type": "application/json", - }, - content=json.dumps({"id": id}), - ) - - -@router.put("/{id}", **update.fastapi_endpoint_config) -def update_project( - id: int, payload: Project, rdb: Engine = Depends(request_rdb) -) -> Response: - """ - Update project - """ - if entry_exists(rdb.connect(), orm.Project, id): - project_payload = payload.dict() - project_payload.pop("concept") # TODO: Save ontology term - project_payload.pop("id") - assets = project_payload.pop("assets") - with Session(rdb) as session: - session.query(orm.Project).filter(orm.Project.id == id).update( - project_payload - ) - adjust_project_assets(id, assets, session) - session.commit() - else: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) - return Response( - headers={ - "content-type": "application/json", - }, - content=json.dumps({"id": id}), - ) - - -@router.delete( - "/{project_id}/assets/{resource_type}/{resource_id}", - **delete.fastapi_endpoint_config, -) -def delete_asset( - project_id: int, - resource_type: ResourceType, - resource_id: int | str, - rdb: Engine = Depends(request_rdb), -) -> Response: - """ - Remove asset - """ - with Session(rdb) as session: - project_assets = list( - session.query(orm.ProjectAsset).filter( - orm.ProjectAsset.project_id == project_id, - orm.ProjectAsset.resource_type == resource_type, - orm.ProjectAsset.resource_id == str(resource_id), - ) - ) - if len(project_assets) == 0: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) - session.delete(project_assets[0]) - session.commit() - return Response( - status_code=status.HTTP_204_NO_CONTENT, - ) - - -@router.post( - "/{project_id}/assets/{resource_type}/{resource_id}", - **create.fastapi_endpoint_config, -) -def create_asset( - project_id: int, - resource_type: ResourceType, - resource_id: int | str, - rdb: Engine = Depends(request_rdb), -) -> Response: - """ - Create asset and return its ID - """ - with Session(rdb) as session: - identical_count = ( - session.query(orm.ProjectAsset) - .filter( - orm.ProjectAsset.project_id == project_id, - orm.ProjectAsset.resource_id == str(resource_id), - orm.ProjectAsset.resource_type == resource_type, - ) - .count() - ) - - if identical_count == 0: - project_asset = orm.ProjectAsset( - project_id=project_id, - resource_id=str(resource_id), - resource_type=resource_type, - ) - session.add(project_asset) - session.commit() - id: int = project_asset.id - - logger.info("new asset created: %i", id) - return Response( - status_code=status.HTTP_201_CREATED, - headers={ - "content-type": "application/json", - }, - content=json.dumps({"id": id}), - ) - return Response(status.HTTP_409_CONFLICT) - - -@router.get("/{id}/assets", **retrieve.fastapi_endpoint_config) -def get_project_assets( - id: int, - types: Optional[List[ResourceType]] = FastAPIQuery( - default=[ - ResourceType.datasets, - ResourceType.models, - ResourceType.model_configurations, - ResourceType.publications, - ResourceType.simulations, - ResourceType.workflows, - ResourceType.artifacts, - ] - ), - rdb: Engine = Depends(request_rdb), -): - """ - Retrieve project assets - """ - if entry_exists(rdb.connect(), orm.Project, id): - with Session(rdb) as session: - # project = session.query(orm.Project).get(id) - assets: Query[orm.ProjectAsset] = session.query(orm.ProjectAsset).filter( - orm.ProjectAsset.project_id == id - ) - assets_key_ids = {type: [] for type in types} - for asset in list(assets): - if asset.resource_type in types: - assets_key_ids[asset.resource_type].append(asset.resource_id) - - assets_key_objects = {} - for key in assets_key_ids: - orm_type = get_resource_orm(key) - orm_schema = get_schema_description(key) - if key in es_resources: - responder = es_list_response[key] - index_singular = key if key[-1] != "s" else key.rstrip("s") - index = f"{settings.ES_INDEX_PREFIX}{index_singular}" - es_items = es.search( - index=index, - query={"ids": {"values": assets_key_ids[key]}}, - fields=responder["fields"], - ) - assets_key_objects[key] = ( - [] - if es_items["hits"]["total"]["value"] == 0 - else responder["function"](es_items["hits"]["hits"]) - ) - else: - assets_key_objects[key] = [ - orm_schema.from_orm(asset) - for asset in session.query(orm_type).filter( - orm_type.id.in_(assets_key_ids[key]) - ) - ] - else: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) - return assets_key_objects From b140e5475f85c4134738d4267b1faf5dc6b907ee Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 11 Jul 2023 06:08:17 -0700 Subject: [PATCH 008/140] Adding project module. --- tds/modules/project/__init__.py | 10 + tds/modules/project/controller.py | 336 ++++++++++++++++++++++++++++++ tds/modules/project/helpers.py | 164 +++++++++++++++ tds/modules/project/model.py | 96 +++++++++ tds/modules/project/response.py | 27 +++ 5 files changed, 633 insertions(+) create mode 100644 tds/modules/project/__init__.py create mode 100644 tds/modules/project/controller.py create mode 100644 tds/modules/project/helpers.py create mode 100644 tds/modules/project/model.py create mode 100644 tds/modules/project/response.py diff --git a/tds/modules/project/__init__.py b/tds/modules/project/__init__.py new file mode 100644 index 000000000..ec1020684 --- /dev/null +++ b/tds/modules/project/__init__.py @@ -0,0 +1,10 @@ +""" + TDS Project Module. + + A simple REST module that creates the basic endpoints for an entity in + Terarium Data Service (TDS). +""" +from tds.modules.project.controller import project_router as router + +ROUTE_PREFIX = "projects" +TAGS = ["Project"] diff --git a/tds/modules/project/controller.py b/tds/modules/project/controller.py new file mode 100644 index 000000000..7ed84ab2f --- /dev/null +++ b/tds/modules/project/controller.py @@ -0,0 +1,336 @@ +""" +CRUD operations for Project +""" +from logging import Logger +from typing import List, Optional + +from elasticsearch import NotFoundError +from fastapi import APIRouter, Depends, HTTPException +from fastapi import Query as FastAPIQuery +from fastapi import status +from fastapi.encoders import jsonable_encoder +from fastapi.responses import JSONResponse +from sqlalchemy.engine.base import Engine +from sqlalchemy.orm import Query, Session + +from tds.autogen.enums import ResourceType +from tds.db import entry_exists, es_client, request_rdb +from tds.modules.project.helpers import ( + ResourceDoesNotExist, + adjust_project_assets, + es_list_response, + es_resources, + save_project, +) +from tds.modules.project.model import Project, ProjectAsset, ProjectPayload +from tds.modules.project.response import ProjectResponse +from tds.operation import create, delete, retrieve, update +from tds.schema.resource import get_resource_orm +from tds.settings import settings + +project_router = APIRouter() +logger = Logger(__name__) +es = es_client() + + +@project_router.get( + "", response_model=list[ProjectResponse], **retrieve.fastapi_endpoint_config +) +def list_projects(rdb: Engine = Depends(request_rdb)) -> JSONResponse: + """ + Retrieve the list of projects. + """ + with Session(rdb) as session: + projects = session.query(Project).all() + + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={"content-type": "application/json"}, + content=jsonable_encoder(projects), + ) + + +@project_router.post("", **create.fastapi_endpoint_config) +def project_post( + payload: ProjectPayload, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Create project and return its ID + """ + try: + with Session(rdb) as session: + project_payload = payload.dict() + if "concept" in project_payload: + # pylint: disable-next=unused-variable + concept_payload = project_payload.pop( + "concept" + ) # TODO: Save ontology term + + project = save_project(project=project_payload, session=session) + + project_id: int = project.id + + logger.info("new project created: %i", project_id) + return JSONResponse( + status_code=status.HTTP_201_CREATED, + headers={ + "location": f"/api/projects/{project_id}", + "content-type": "application/json", + }, + content={"id": project_id}, + ) + except ResourceDoesNotExist as error: + return JSONResponse( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + headers={"content-type": "application/json"}, + content={"message": error.message}, + ) + + +@project_router.get( + "/{project_id}", response_model=ProjectResponse, **retrieve.fastapi_endpoint_config +) +def project_get(project_id: int, rdb: Engine = Depends(request_rdb)) -> JSONResponse: + """ + Retrieve a project from ElasticSearch + """ + try: + if entry_exists(rdb.connect(), Project, project_id): + with Session(rdb) as session: + project = session.query(Project).get(project_id) + # pylint: disable-next=unused-variable + parameters: Query[ProjectAsset] = session.query(ProjectAsset).filter( + ProjectAsset.project_id == project_id + ) + else: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) + + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={"content-type": "application/json"}, + content=jsonable_encoder(project), + ) + except NotFoundError: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={"content-type": "application/json"}, + content={"message": f"The project with id {project_id} was not found."}, + ) + + +@project_router.put("/{project_id}", **update.fastapi_endpoint_config) +def project_put( + project_id: int, payload: ProjectPayload, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Update a project. + """ + try: + if entry_exists(rdb.connect(), Project, project_id): + with Session(rdb) as session: + project_payload = payload.dict() + assets = project_payload.pop("assets") + if "concept" in project_payload: + # pylint: disable-next=unused-variable + concept_payload = project_payload.pop( + "concept" + ) # TODO: Save ontology term + + session.query(Project).filter(Project.id == project_id).update( + project_payload + ) + adjust_project_assets(project_id, assets, session) + session.commit() + + logger.info("new project created: %i", project_id) + return JSONResponse( + status_code=status.HTTP_202_ACCEPTED, + headers={"content-type": "application/json"}, + content={"id": project_id}, + ) + + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) + except ResourceDoesNotExist as error: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={"content-type": "application/json"}, + content={"message": error.message}, + ) + + +@project_router.delete("/{project_id}", **delete.fastapi_endpoint_config) +def project_delete(project_id: int, rdb: Engine = Depends(request_rdb)) -> JSONResponse: + """ + Deactivate project + """ + try: + if entry_exists(rdb.connect(), Project, project_id): + with Session(rdb) as session: + project = session.query(Project).get(project_id) + + # set to dict and active to false + project_ = project.__dict__ + project_.pop("_sa_instance_state") + project_["active"] = False + + with Session(rdb) as session: + session.query(Project).filter(Project.id == project_id).update(project_) + session.commit() + + else: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) + return JSONResponse( + headers={"content-type": "application/json"}, + content={"id": project_id, "status": project_["active"]}, + ) + except NotFoundError: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={"content-type": "application/json"}, + content={ + "id": project_id, + "message": f"Project with ID {project_id} not found.", + }, + ) + + +@project_router.delete( + "/{project_id}/assets/{resource_type}/{resource_id}", + **delete.fastapi_endpoint_config, +) +def delete_asset( + project_id: int, + resource_type: ResourceType, + resource_id: int | str, + rdb: Engine = Depends(request_rdb), +) -> JSONResponse: + """ + Remove asset + """ + with Session(rdb) as session: + project_assets = list( + session.query(ProjectAsset).filter( + ProjectAsset.project_id == project_id, + ProjectAsset.resource_type == resource_type, + ProjectAsset.resource_id == str(resource_id), + ) + ) + if len(project_assets) == 0: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) + # Loop through assets because the result is an array and if there are + # more than one result, we want to remove it anyway. + for asset in project_assets: + session.delete(asset) + session.commit() + return JSONResponse( + status_code=status.HTTP_204_NO_CONTENT, + headers={"content-type": "application/json"}, + content={"message": "Asset has been deleted."}, + ) + + +@project_router.post( + "/{project_id}/assets/{resource_type}/{resource_id}", + **create.fastapi_endpoint_config, +) +def create_asset( + project_id: int, + resource_type: ResourceType, + resource_id: int | str, + rdb: Engine = Depends(request_rdb), +) -> JSONResponse: + """ + Create asset and return its ID + """ + with Session(rdb) as session: + identical_count = ( + session.query(ProjectAsset) + .filter( + ProjectAsset.project_id == project_id, + ProjectAsset.resource_id == str(resource_id), + ProjectAsset.resource_type == resource_type, + ) + .count() + ) + + if identical_count == 0: + project_asset = ProjectAsset( + project_id=project_id, + resource_id=str(resource_id), + resource_type=resource_type, + ) + session.add(project_asset) + session.commit() + asset_id: int = project_asset.id + + logger.info("new asset created: %i", asset_id) + return JSONResponse( + status_code=status.HTTP_201_CREATED, + headers={"content-type": "application/json"}, + content={"id": asset_id}, + ) + return JSONResponse( + status_code=status.HTTP_409_CONFLICT, + headers={"content-type": "application/json"}, + content={"message": "Asset already exists for project."}, + ) + + +@project_router.get("/{project_id}/assets", **retrieve.fastapi_endpoint_config) +def get_project_assets( + project_id: int, + types: Optional[List[ResourceType]] = FastAPIQuery( + default=[ + ResourceType.datasets, + ResourceType.models, + ResourceType.model_configurations, + ResourceType.publications, + ResourceType.simulations, + ResourceType.workflows, + ResourceType.artifacts, + ] + ), + rdb: Engine = Depends(request_rdb), +) -> JSONResponse: + """ + Retrieve project assets + """ + if entry_exists(rdb.connect(), Project, project_id): + with Session(rdb) as session: + project = session.query(Project).get(project_id) + assets = project.assets + assets_key_ids = {type: [] for type in types} + for asset in list(assets): + if asset.resource_type in types: + assets_key_ids[asset.resource_type].append(asset.resource_id) + + assets_key_objects = {} + for key in assets_key_ids: + orm_type = get_resource_orm(key) + if key in es_resources: + responder = es_list_response[key] + index_singular = key if key[-1] != "s" else key.rstrip("s") + index = f"{settings.ES_INDEX_PREFIX}{index_singular}" + es_items = es.search( + index=index, + query={"ids": {"values": assets_key_ids[key]}}, + fields=responder["fields"], + ) + assets_key_objects[key] = ( + [] + if es_items["hits"]["total"]["value"] == 0 + else responder["function"](es_items["hits"]["hits"]) + ) + else: + assets_key_objects[key] = ( + session.query(orm_type) + .filter(orm_type.id.in_(assets_key_ids[key])) + .all() + ) + else: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={"content-type": "application/json"}, + content=jsonable_encoder(assets_key_objects), + ) diff --git a/tds/modules/project/helpers.py b/tds/modules/project/helpers.py new file mode 100644 index 000000000..0b3e3ff5a --- /dev/null +++ b/tds/modules/project/helpers.py @@ -0,0 +1,164 @@ +""" +TDS Project helpers. +""" +from collections import defaultdict +from typing import Dict, List + +from sqlalchemy.orm import Session + +from tds.db import entry_exists, es_client, rdb +from tds.lib.utils import get_singular_index +from tds.modules.artifact.response import artifact_response +from tds.modules.dataset.response import dataset_response +from tds.modules.model.utils import model_list_fields, model_list_response +from tds.modules.model_configuration.response import configuration_response +from tds.modules.project.model import Project, ProjectAsset +from tds.modules.simulation.response import simulation_response +from tds.modules.workflow.response import workflow_response +from tds.schema.resource import ResourceType, get_resource_orm +from tds.settings import settings + +es_list_response = { + ResourceType.models: {"function": model_list_response, "fields": model_list_fields}, + ResourceType.model_configurations: { + "function": configuration_response, + "fields": None, + }, + ResourceType.datasets: {"function": dataset_response, "fields": None}, + ResourceType.simulations: {"fields": None, "function": simulation_response}, + ResourceType.workflows: {"fields": None, "function": workflow_response}, + ResourceType.artifacts: {"fields": None, "function": artifact_response}, +} + +es_resources = [ + ResourceType.datasets, + ResourceType.models, + ResourceType.model_configurations, + ResourceType.simulations, + ResourceType.workflows, + ResourceType.artifacts, +] + + +class ResourceDoesNotExist(Exception): + """ + ResourceDoesNotExist Exception class. + """ + + message = "The Requested Resource does not exist." + + def __init__(self, resource_type): + self.message = f"{resource_type}: {self.message}" + + +def save_project(project: dict, session): + """ + Function saves the project from a payload dict. + """ + asset_dict = project.pop("assets") + asset_records = [] + assets = check_assets(assets=asset_dict) + + if assets: + project = Project(**project) + session.add(project) + session.commit() + build_asset_records( + project_id=project.id, asset_ids=asset_dict, session=session + ) + session.commit() + return project + + +def check_assets(assets: list) -> bool: + """ + Function verifies assets exist before saving the project. + """ + for resource_type in assets: + if resource_type in es_resources: + resources = handle_es_resource( + object_resource=resource_type, object_ids=assets[resource_type] + ) + else: + resources = handle_orm_resource( + object_resource=resource_type, object_ids=assets[resource_type] + ) + + if resources is False: + raise ResourceDoesNotExist(resource_type) + + return True + + +def handle_es_resource(object_resource: str, object_ids: list): + """ + Function handles an ElasticSearch asset resource. + """ + es = es_client() + index = get_singular_index(f"{settings.ES_INDEX_PREFIX}{object_resource}") + query = {"ids": {"values": object_ids}} + res = es.search(index=index, query=query) + + if int(res["hits"]["total"]["value"]) != len(object_ids): + return False + + return True + + +def handle_orm_resource(object_resource: ResourceType, object_ids: list): + """ + Function handles ORM project assets. + """ + current_orm = get_resource_orm(object_resource) + if not all((entry_exists(rdb.connect(), current_orm, oid) for oid in object_ids)): + raise ResourceDoesNotExist(object_resource) + return True + + +def build_asset_records(project_id, asset_ids, session): + """ + Function builds the asset record list and saves it to the DB. + """ + for resource_type in asset_ids: + resource_ids = asset_ids[resource_type] + project_assets = [ + ProjectAsset( + project_id=project_id, + resource_id=resource_id, + resource_type=resource_type, + external_ref="", + ) + for resource_id in resource_ids + ] + session.bulk_save_objects(project_assets) + + +def adjust_project_assets( + project_id: int, assets: Dict[ResourceType, List[int]], session: Session +): + """ + Add new entries and remove unused entries + """ + active = defaultdict(list) + for asset in session.query(ProjectAsset).filter( + ProjectAsset.project_id == project_id + ): + active[asset.resource_type].append(asset.resource_id) + + for resource_type, resource_ids in assets.items(): + project_assets = [ + ProjectAsset( + project_id=project_id, + resource_id=resource_id, + resource_type=resource_type, + external_ref="", + ) + for resource_id in resource_ids + if resource_id not in active[resource_type] + ] + session.bulk_save_objects(project_assets) + + for resource_type, resource_ids in active.items(): + inactive_ids = set(resource_ids) - set(assets.get(resource_type, [])) + for inactive_id in inactive_ids: + session.delete(session.query(ProjectAsset).get(inactive_id)) diff --git a/tds/modules/project/model.py b/tds/modules/project/model.py new file mode 100644 index 000000000..2b7882a60 --- /dev/null +++ b/tds/modules/project/model.py @@ -0,0 +1,96 @@ +""" +TDS Project Data Model Definition. +""" +from typing import Optional + +import sqlalchemy as sa +from pydantic import BaseModel +from sqlalchemy.orm import relationship +from sqlalchemy.sql import func + +from tds.autogen.enums import ResourceType +from tds.autogen.orm import Base + + +class Project(Base): + """ + Project data model. + """ + + __tablename__ = "project" + + id = sa.Column(sa.Integer(), primary_key=True) + name = sa.Column(sa.String(), nullable=False) + description = sa.Column(sa.String(), nullable=False) + timestamp = sa.Column(sa.DateTime(), server_default=func.now()) + active = sa.Column(sa.Boolean(), nullable=False) + username = sa.Column(sa.String()) + + assets = relationship( + "ProjectAsset", + uselist=True, + foreign_keys=[id], + primaryjoin="Project.id == ProjectAsset.project_id", + backref="project", + ) + + class Config: + """ + Project Data Model Swagger Example + """ + + schema_extra = {"example": {}} + + +class ProjectPayload(BaseModel): + """ + Project Pydantic Model. + """ + + id: Optional[int] = None + name: str + description: str + assets: Optional[dict] + active: bool + username: Optional[str] + + class Config: + """ + Project Data Model Swagger Example + """ + + schema_extra = { + "example": { + "name": "A cool project", + "description": "Project info goes here.", + "assets": [], + "active": "true", + "username": "Loki", + } + } + + +class ProjectAsset(Base): + """ + ProjectAsset Data Model. + """ + + __tablename__ = "project_asset" + + id = sa.Column(sa.Integer(), primary_key=True) + project_id = sa.Column(sa.Integer(), sa.ForeignKey("project.id"), nullable=False) + resource_id = sa.Column(sa.String(), nullable=False) + resource_type = sa.Column(sa.Enum(ResourceType), nullable=False) + external_ref = sa.Column(sa.String()) + + +class ProjectAssetPayload(BaseModel): + """ + ProjectAssetPayload Data Model. + """ + + id: Optional[int] = None + project_id: Optional[int] = None + resource_id: Optional[int] = None + resource_type: ResourceType + external_ref: Optional[str] diff --git a/tds/modules/project/response.py b/tds/modules/project/response.py new file mode 100644 index 000000000..45b5cf2d1 --- /dev/null +++ b/tds/modules/project/response.py @@ -0,0 +1,27 @@ +""" +TDS Project Response object. +""" +from datetime import datetime +from typing import Optional + +from pydantic import BaseModel + + +class ProjectResponse(BaseModel): + """ + ProjectResponse Class. + """ + + id: Optional[int] = None + name: str + description: str + timestamp: Optional[datetime] = datetime.now() + active: bool + username: Optional[str] + + +def project_response(project_list): + """ + Function builds list of projects for response. + """ + return [ProjectResponse(**x["_source"]) for x in project_list] From 08756ef456522d1dd46c3c5e262c4685d1769750 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 11 Jul 2023 09:59:08 -0700 Subject: [PATCH 009/140] Removed more items from autogen schema. --- tds/autogen/schema.py | 47 ++----------------------------------------- 1 file changed, 2 insertions(+), 45 deletions(-) diff --git a/tds/autogen/schema.py b/tds/autogen/schema.py index 3f73c54ed..dda492373 100644 --- a/tds/autogen/schema.py +++ b/tds/autogen/schema.py @@ -7,18 +7,9 @@ import datetime from typing import Optional -from pydantic import BaseModel, Json +from pydantic import BaseModel -from tds.autogen.enums import ( - ExtractedType, - OntologicalField, - ProvenanceType, - RelationType, - ResourceType, - Role, - TaggableType, - ValueType, -) +from tds.autogen.enums import ExtractedType, OntologicalField, TaggableType, ValueType class QualifierXref(BaseModel): @@ -68,26 +59,6 @@ class OntologyConcept(BaseModel): status: OntologicalField -class Provenance(BaseModel): - id: Optional[int] = None - timestamp: datetime.datetime = datetime.datetime.now() - relation_type: RelationType - left: str - left_type: ProvenanceType - right: str - right_type: ProvenanceType - user_id: Optional[int] - concept: Optional[str] - - -class Association(BaseModel): - id: Optional[int] = None - person_id: Optional[int] = None - resource_id: Optional[int] = None - resource_type: Optional[ResourceType] - role: Optional[Role] - - class ModelFramework(BaseModel): name: str version: str @@ -106,17 +77,3 @@ class Publication(BaseModel): id: Optional[int] = None xdd_uri: str title: str - - -class Person(BaseModel): - id: Optional[int] = None - name: str - email: str - org: Optional[str] - website: Optional[str] - is_registered: bool - - -class ActiveConcept(BaseModel): - curie: str - name: Optional[str] From dfd66a565c9d1217ccb799bf584a3f4971079260 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 11 Jul 2023 09:59:26 -0700 Subject: [PATCH 010/140] Removed more items from autogen orm. --- tds/autogen/orm.py | 35 +---------------------------------- 1 file changed, 1 insertion(+), 34 deletions(-) diff --git a/tds/autogen/orm.py b/tds/autogen/orm.py index b43bbf581..12757e9e2 100644 --- a/tds/autogen/orm.py +++ b/tds/autogen/orm.py @@ -8,7 +8,7 @@ from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.sql import func -from tds.autogen.enums import ExtractedType, ResourceType, Role, ValueType +from tds.autogen.enums import ExtractedType, ValueType Base = declarative_base() @@ -23,18 +23,6 @@ class QualifierXref(Base): feature_id = sa.Column(sa.Integer(), sa.ForeignKey("feature.id"), nullable=False) -class ModelRuntime(Base): - __tablename__ = "model_runtime" - - id = sa.Column(sa.Integer(), primary_key=True) - timestamp = sa.Column(sa.DateTime(), nullable=False, server_default=func.now()) - name = sa.Column(sa.String(), nullable=False) - left = sa.Column(sa.String(), sa.ForeignKey("model_framework.name"), nullable=False) - right = sa.Column( - sa.String(), sa.ForeignKey("model_framework.name"), nullable=False - ) - - class Feature(Base): __tablename__ = "feature" @@ -68,16 +56,6 @@ class Extraction(Base): img = sa.Column(sa.LargeBinary(), nullable=False) -class Association(Base): - __tablename__ = "association" - - id = sa.Column(sa.Integer(), primary_key=True) - person_id = sa.Column(sa.Integer(), sa.ForeignKey("person.id"), nullable=False) - resource_id = sa.Column(sa.Integer(), nullable=False) - resource_type = sa.Column(sa.Enum(ResourceType)) - role = sa.Column(sa.Enum(Role)) - - class ModelFramework(Base): __tablename__ = "model_framework" @@ -102,14 +80,3 @@ class Publication(Base): id = sa.Column(sa.Integer(), primary_key=True) xdd_uri = sa.Column(sa.String(), nullable=False) title = sa.Column(sa.String(), nullable=False) - - -class Person(Base): - __tablename__ = "person" - - id = sa.Column(sa.Integer(), primary_key=True) - name = sa.Column(sa.String(), nullable=False) - email = sa.Column(sa.String(), nullable=False) - org = sa.Column(sa.String()) - website = sa.Column(sa.String()) - is_registered = sa.Column(sa.Boolean(), nullable=False) From 6089822de7153f8fb968a2c9dba54bdadcf26abb Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 11 Jul 2023 09:59:54 -0700 Subject: [PATCH 011/140] Updated ProvenanceType location in query helpers. --- tds/db/graph/query_helpers.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/tds/db/graph/query_helpers.py b/tds/db/graph/query_helpers.py index 462b50460..9d48a2df4 100644 --- a/tds/db/graph/query_helpers.py +++ b/tds/db/graph/query_helpers.py @@ -6,6 +6,7 @@ from fastapi import HTTPException from tds.autogen import schema +from tds.autogen.enums import ProvenanceType from tds.schema.provenance import provenance_type_to_abbr @@ -25,7 +26,7 @@ def dynamic_relationship_direction(direction, relationship_type): ) -def derived_models_query_generater(root_type: schema.ProvenanceType, root_id): +def derived_models_query_generater(root_type: ProvenanceType, root_id): """ return all models, model revisions (sometimes intermediates) that were derived from a publication or intermediate @@ -63,7 +64,7 @@ def derived_models_query_generater(root_type: schema.ProvenanceType, root_id): ) -def parent_model_query_generator(root_type: schema.ProvenanceType, root_id): +def parent_model_query_generator(root_type: ProvenanceType, root_id): """ Return match query to ModelRevision depending on root_type """ @@ -71,19 +72,19 @@ def parent_model_query_generator(root_type: schema.ProvenanceType, root_id): relationships_str = relationships_array_as_str( exclude=["CONTAINS", "IS_CONCEPT_OF"] ) - model_revision_node = node_builder(node_type=schema.ProvenanceType.Model) + model_revision_node = node_builder(node_type=ProvenanceType.Model) query_templates_index = { - schema.ProvenanceType.Model: f"-[r:BEGINS_AT]->{model_revision_node} ", - schema.ProvenanceType.ModelConfiguration: f"-[r:USES]->{model_revision_node} ", - schema.ProvenanceType.Simulation: "" + ProvenanceType.Model: f"-[r:BEGINS_AT]->{model_revision_node} ", + ProvenanceType.ModelConfiguration: f"-[r:USES]->{model_revision_node} ", + ProvenanceType.Simulation: "" + f"-[r:{relationships_str} *1..]->{model_revision_node} ", - schema.ProvenanceType.Dataset: "" + ProvenanceType.Dataset: "" + f"-[r:{relationships_str} *1..]->{model_revision_node} ", } return match_node + query_templates_index[root_type] -def match_node_builder(node_type: schema.ProvenanceType = None, node_id=None): +def match_node_builder(node_type: ProvenanceType = None, node_id=None): """ return node with match statement """ @@ -95,7 +96,7 @@ def match_node_builder(node_type: schema.ProvenanceType = None, node_id=None): return f"Match ({node_type_character}:{node_type} {{id: '{node_id}'}}) " -def return_node_abbr(root_type: schema.ProvenanceType): +def return_node_abbr(root_type: ProvenanceType): """ Return node type abbr """ @@ -121,7 +122,7 @@ def relationships_array_as_str(exclude=None, include=None): return relationship_str[:-1] -def node_builder(node_type: schema.ProvenanceType = None, node_id=None): +def node_builder(node_type: ProvenanceType = None, node_id=None): """ Return node """ @@ -223,7 +224,7 @@ def nodes_edges( nodes=True, edges=False, versions=False, - types=List[schema.ProvenanceType], + types=List[ProvenanceType], ): """ Return connected nodes and edges From 0ae7767d6e6b95c75eaef41bea120ec32d8db2c6 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 11 Jul 2023 10:00:09 -0700 Subject: [PATCH 012/140] Removing person router. --- tds/routers/persons.py | 145 ----------------------------------------- 1 file changed, 145 deletions(-) delete mode 100644 tds/routers/persons.py diff --git a/tds/routers/persons.py b/tds/routers/persons.py deleted file mode 100644 index 16add4c2e..000000000 --- a/tds/routers/persons.py +++ /dev/null @@ -1,145 +0,0 @@ -""" -CRUD operations for persons and related tables in the DB -""" - -import json -from logging import Logger - -from fastapi import APIRouter, Depends, Response, status -from sqlalchemy.engine.base import Engine -from sqlalchemy.orm import Session - -from tds.autogen import orm, schema -from tds.db import list_by_id, request_rdb - -logger = Logger(__file__) -router = APIRouter() - - -@router.get("/associations/{id}") -def get_association(id: int, rdb: Engine = Depends(request_rdb)) -> str: - """ - Get a specific association by ID - """ - with Session(rdb) as session: - result = session.query(orm.Association).get(id) - return result - - -@router.post("/associations") -def create_association(payload: schema.Association, rdb: Engine = Depends(request_rdb)): - """ - Create a association - """ - with Session(rdb) as session: - associationp = payload.dict() - del associationp["id"] - association = orm.Association(**associationp) - session.add(association) - session.commit() - data_id = association.id - associationp["id"] = data_id - return Response( - status_code=status.HTTP_201_CREATED, - headers={ - "content-type": "application/json", - }, - content=json.dumps(associationp), - ) - - -@router.patch("/associations/{id}") -def update_association( - payload: schema.Association, id: int, rdb: Engine = Depends(request_rdb) -) -> str: - """ - Update a association by ID - """ - with Session(rdb) as session: - data_payload = payload.dict(exclude_unset=True) - data_payload["id"] = id - logger.info(data_payload) - - data_to_update = session.query(orm.Association).filter(orm.Association.id == id) - data_to_update.update(data_payload) - session.commit() - return "Updated association" - - -@router.delete("/associations/{id}") -def delete_association(id: int, rdb: Engine = Depends(request_rdb)) -> str: - """ - Delete a association by ID - """ - with Session(rdb) as session: - session.query(orm.Association).filter(orm.Association.id == id).delete() - session.commit() - - -@router.get("") -def get_persons( - page_size: int = 100, page: int = 0, rdb: Engine = Depends(request_rdb) -): - """ - Page over persons - """ - return list_by_id(rdb.connect(), orm.Person, page_size, page) - - -@router.get("/{id}") -def get_person(id: int, rdb: Engine = Depends(request_rdb)) -> str: - """ - Get a specific person by ID - """ - with Session(rdb) as session: - return session.query(orm.Person).get(id) - - -@router.post("") -def create_person(payload: schema.Person, rdb: Engine = Depends(request_rdb)): - """ - Create a person - """ - with Session(rdb) as session: - personp = payload.dict() - del personp["id"] - person = orm.Person(**personp) - session.add(person) - session.commit() - data_id = person.id - personp["id"] = data_id - return Response( - status_code=status.HTTP_201_CREATED, - headers={ - "content-type": "application/json", - }, - content=json.dumps(personp), - ) - - -@router.patch("/{id}") -def update_person( - payload: schema.Person, id: int, rdb: Engine = Depends(request_rdb) -) -> str: - """ - Update a person by ID - """ - with Session(rdb) as session: - data_payload = payload.dict(exclude_unset=True) - data_payload["id"] = id - logger.info(data_payload) - - data_to_update = session.query(orm.Person).filter(orm.Person.id == id) - data_to_update.update(data_payload) - session.commit() - return "Updated Person" - - -@router.delete("/{id}") -def delete_person(id: int, rdb: Engine = Depends(request_rdb)): - """ - Delete a person by ID - """ - with Session(rdb) as session: - session.query(orm.Person).filter(orm.Person.id == id).delete() - session.commit() From 6e93cb766248c64f8258ff20ef9076330cebd93d Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 11 Jul 2023 10:00:27 -0700 Subject: [PATCH 013/140] Updated ResourceType import location. --- tds/schema/resource.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tds/schema/resource.py b/tds/schema/resource.py index 58cb68633..57e736f48 100644 --- a/tds/schema/resource.py +++ b/tds/schema/resource.py @@ -7,7 +7,7 @@ from typing import Dict, Optional, Type from tds.autogen import orm, schema -from tds.autogen.schema import ResourceType +from tds.autogen.enums import ResourceType from tds.modules.artifact.model import Artifact from tds.modules.dataset.model import Dataset from tds.modules.model.model import Model From f67c325979c36eabf244c01ef79e161fdd0e04f7 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 11 Jul 2023 10:00:59 -0700 Subject: [PATCH 014/140] Updated ProvenanceType location. --- tds/schema/provenance.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/tds/schema/provenance.py b/tds/schema/provenance.py index 11a5271ba..553ef226b 100644 --- a/tds/schema/provenance.py +++ b/tds/schema/provenance.py @@ -6,10 +6,11 @@ from pydantic import BaseModel, Field # pylint: disable=missing-class-docstring -from tds.autogen import schema +from tds.autogen.enums import ProvenanceType +from tds.modules.provenance.model import Provenance as ProvenanceModel -class Provenance(schema.Provenance): +class Provenance(ProvenanceModel): class Config: orm_mode = True @@ -22,15 +23,15 @@ class NodeSchema(BaseModel): class ProvenancePayload(BaseModel): root_id: Optional[str] = Field(default=1) - root_type: Optional[schema.ProvenanceType] = Field(default="Publication") + root_type: Optional[ProvenanceType] = Field(default="Publication") user_id: Optional[int] curie: Optional[str] edges: Optional[bool] = Field(default=False) nodes: Optional[bool] = Field(default=True) - types: List[schema.ProvenanceType] = Field( + types: List[ProvenanceType] = Field( default=[ type - for type in schema.ProvenanceType + for type in ProvenanceType if type not in ["Concept", "ModelRevision", "Project"] ] ) @@ -39,12 +40,12 @@ class ProvenancePayload(BaseModel): verbose: Optional[bool] = Field(default=False) -provenance_type_to_abbr: Dict[Type[schema.ProvenanceType], str] = { - schema.ProvenanceType.Dataset: "Ds", - schema.ProvenanceType.Model: "Md", - schema.ProvenanceType.ModelConfiguration: "Mc", - schema.ProvenanceType.Publication: "Pu", - schema.ProvenanceType.Simulation: "Si", - schema.ProvenanceType.Project: "Pr", - schema.ProvenanceType.Concept: "Cn", +provenance_type_to_abbr: Dict[Type[ProvenanceType], str] = { + ProvenanceType.Dataset: "Ds", + ProvenanceType.Model: "Md", + ProvenanceType.ModelConfiguration: "Mc", + ProvenanceType.Publication: "Pu", + ProvenanceType.Simulation: "Si", + ProvenanceType.Project: "Pr", + ProvenanceType.Concept: "Cn", } From 0e32e71499c3fa887cdd7530730dec7b637fa0e4 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 11 Jul 2023 10:08:00 -0700 Subject: [PATCH 015/140] Adding person module. --- tds/modules/person/__init__.py | 10 + tds/modules/person/controller.py | 318 +++++++++++++++++++++++++++++++ tds/modules/person/model.py | 85 +++++++++ tds/modules/person/response.py | 26 +++ 4 files changed, 439 insertions(+) create mode 100644 tds/modules/person/__init__.py create mode 100644 tds/modules/person/controller.py create mode 100644 tds/modules/person/model.py create mode 100644 tds/modules/person/response.py diff --git a/tds/modules/person/__init__.py b/tds/modules/person/__init__.py new file mode 100644 index 000000000..dccea8687 --- /dev/null +++ b/tds/modules/person/__init__.py @@ -0,0 +1,10 @@ +""" + TDS Person Module. + + A simple REST module that creates the basic endpoints for an entity in + Terarium Data Service (TDS). +""" +from tds.modules.person.controller import person_router as router + +ROUTE_PREFIX = "persons" +TAGS = ["Person"] diff --git a/tds/modules/person/controller.py b/tds/modules/person/controller.py new file mode 100644 index 000000000..6b4a72716 --- /dev/null +++ b/tds/modules/person/controller.py @@ -0,0 +1,318 @@ +""" + TDS Person Controller. +""" +from logging import Logger + +from fastapi import APIRouter, Depends, status +from fastapi.encoders import jsonable_encoder +from fastapi.responses import JSONResponse +from sqlalchemy.engine.base import Engine +from sqlalchemy.orm import Session +from sqlalchemy.orm.exc import NoResultFound + +from tds.db import entry_exists, list_by_id, request_rdb +from tds.modules.person.model import ( + Association, + AssociationPayload, + Person, + PersonPayload, +) +from tds.modules.person.response import PersonResponse +from tds.operation import create, delete, retrieve, update + +person_router = APIRouter() +logger = Logger(__name__) + + +@person_router.get( + "", response_model=list[PersonResponse], **retrieve.fastapi_endpoint_config +) +def list_persons( + page_size: int = 100, page: int = 0, rdb: Engine = Depends(request_rdb) +): + """ + Page over persons + """ + people = list_by_id(rdb.connect(), Person, page_size, page) + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content=jsonable_encoder(people), + ) + + +@person_router.post("", **create.fastapi_endpoint_config) +def person_post( + payload: PersonPayload, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Create person and return its ID + """ + try: + with Session(rdb) as session: + record = Person(**payload.dict()) + session.add(record) + session.commit() + + return JSONResponse( + status_code=status.HTTP_201_CREATED, + headers={ + "content-type": "application/json", + }, + content={"id": record.id}, + ) + except Exception as error: + return JSONResponse( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + headers={ + "content-type": "application/json", + }, + content={"message": f"Person was not created. {error}"}, + ) + + +@person_router.get( + "/{person_id}", response_model=PersonResponse, **retrieve.fastapi_endpoint_config +) +def person_get(person_id: int, rdb: Engine = Depends(request_rdb)) -> JSONResponse: + """ + Retrieve a person from postgres. + """ + try: + with Session(rdb) as session: + person = session.query(Person).get(person_id) + print(person) + + logger.info("Person retrieved: %s", person_id) + + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content=jsonable_encoder(person), + ) + except NoResultFound: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={ + "content-type": "application/json", + }, + content={"message": f"The person with id {person_id} does not exist."}, + ) + + +@person_router.put("/{person_id}", **update.fastapi_endpoint_config) +def person_put( + person_id: int, payload: PersonPayload, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Update a person object. + """ + try: + if entry_exists(rdb.connect(), Person, person_id): + with Session(rdb) as session: + project_payload = payload.dict() + + session.query(Person).filter(Person.id == person_id).update( + project_payload + ) + session.commit() + + logger.info("new project created: %i", person_id) + return JSONResponse( + status_code=status.HTTP_202_ACCEPTED, + headers={"content-type": "application/json"}, + content={"id": person_id}, + ) + except NoResultFound as error: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={ + "content-type": "application/json", + }, + content={ + "message": f"Person with id {person_id} does not exist. {error.code}" + }, + ) + + +@person_router.delete("/{person_id}", **delete.fastapi_endpoint_config) +def person_delete(person_id: int, rdb: Engine = Depends(request_rdb)) -> JSONResponse: + """ + Delete a Person + """ + try: + if entry_exists(rdb.connect(), Person, person_id): + with Session(rdb) as session: + person = session.query(Person).filter(Person.id == person_id).first() + session.delete(person) + session.commit() + + logger.info("Person deleted: %i", person_id) + return JSONResponse( + status_code=status.HTTP_202_ACCEPTED, + headers={"content-type": "application/json"}, + content={"message": f"Person ({person_id}) deleted."}, + ) + raise NoResultFound + except NoResultFound: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={ + "content-type": "application/json", + }, + content={"message": f"Person with id {person_id} does not exist."}, + ) + + +@person_router.get( + "/{person_id}/associations", + response_model=PersonResponse, + **retrieve.fastapi_endpoint_config, +) +def person_associations( + person_id: int, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Retrieve a person's associations. + """ + try: + if entry_exists(rdb.connect(), Person, person_id): + with Session(rdb) as session: + person = session.query(Person).get(person_id) + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content=jsonable_encoder(person.associations), + ) + raise NoResultFound + except NoResultFound as error: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={ + "content-type": "application/json", + }, + content={ + "message": f"Person with id {person_id} does not exist. {error.code}" + }, + ) + + +@person_router.post("/{person_id}/associations", **create.fastapi_endpoint_config) +def create_association( + person_id: int, payload: AssociationPayload, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Create a person -> association record. + """ + try: + if entry_exists(rdb.connect(), Person, person_id): + with Session(rdb) as session: + person = session.query(Person).get(person_id) + association = Association(**payload.dict()) + person.associations.append(association) + session.commit() + return JSONResponse( + status_code=status.HTTP_201_CREATED, + headers={ + "content-type": "application/json", + }, + content={"id": association.id}, + ) + raise NoResultFound + except NoResultFound as error: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={ + "content-type": "application/json", + }, + content={ + "message": f"Person with id {person_id} does not exist. {error.code}" + }, + ) + + +@person_router.delete( + "/{person_id}/associations/{association_id}", **delete.fastapi_endpoint_config +) +def delete_association( + person_id: int, association_id: int, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Delete a person -> association record. + """ + try: + print(f"Deleting Record...Person:{person_id} -> Association:{association_id}") + if entry_exists(rdb.connect(), Person, person_id) and entry_exists( + rdb.connect(), Association, association_id + ): + with Session(rdb) as session: + person = session.query(Person).get(person_id) + association = session.query(Association).get(association_id) + print(association) + print(association.person) + person.associations.remove(association) + session.add(person) + session.commit() + # session.delete(association) + # session.commit() + return JSONResponse( + status_code=status.HTTP_202_ACCEPTED, + headers={ + "content-type": "application/json", + }, + content={"message": f"Association {association_id} deleted."}, + ) + raise NoResultFound + except NoResultFound as error: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={ + "content-type": "application/json", + }, + content={ + "message": f"Person with id {person_id} does not have " + f"an association with id {association_id}. " + f"{error.code}" + }, + ) + + +@person_router.get("/{person_id}/associations/{association_id}") +def get_association( + person_id: int, association_id: int, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Get a specific association by ID + """ + try: + if entry_exists(rdb.connect(), Person, person_id) and entry_exists( + rdb.connect(), Association, association_id + ): + with Session(rdb) as session: + association = session.query(Association).get(association_id) + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content=jsonable_encoder(association), + ) + raise NoResultFound + except NoResultFound as error: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={ + "content-type": "application/json", + }, + content={ + "message": f"Person with id {person_id} does not have " + f"an association with id {association_id}. " + f"{error.code}" + }, + ) diff --git a/tds/modules/person/model.py b/tds/modules/person/model.py new file mode 100644 index 000000000..ddeb4dfd6 --- /dev/null +++ b/tds/modules/person/model.py @@ -0,0 +1,85 @@ +""" +TDS Person Data Model Definition. +""" +from typing import Any, List, Optional + +import sqlalchemy as sa +from pydantic import BaseModel +from sqlalchemy.orm import relationship + +from tds.autogen.enums import ResourceType, Role +from tds.autogen.orm import Base + + +class Person(Base): + """ + Person Data Model + """ + + __tablename__ = "person" + + id = sa.Column(sa.Integer(), primary_key=True) + name = sa.Column(sa.String(), nullable=False) + email = sa.Column(sa.String(), nullable=False) + org = sa.Column(sa.String()) + website = sa.Column(sa.String()) + is_registered = sa.Column(sa.Boolean(), nullable=False) + + associations = relationship( + "Association", + uselist=True, + foreign_keys=[id], + primaryjoin="Person.id == Association.person_id", + backref="person", + cascade_backrefs=False, + # cascade="save-update", + # single_parent=True, + ) + + class Config: + """ + Person Data Model Swagger Example + """ + + schema_extra = {"example": {}} + + +class PersonPayload(BaseModel): + """ + PersonPayload Data Model. + """ + + id: Optional[int] = None + name: str + email: str + org: Optional[str] + website: Optional[str] + is_registered: bool + + +class Association(Base): + """ + Association Data Model + """ + + __tablename__ = "association" + + id = sa.Column(sa.Integer(), primary_key=True) + person_id = sa.Column(sa.Integer(), sa.ForeignKey("person.id"), nullable=False) + resource_id = sa.Column(sa.String(), nullable=False) + resource_type = sa.Column(sa.Enum(ResourceType)) + role = sa.Column(sa.Enum(Role)) + + person = relationship("Person", cascade=False, single_parent=True) + + +class AssociationPayload(BaseModel): + """ + PersonPayload Data Model. + """ + + id: Optional[int] = None + person_id: int + resource_id: str + resource_type: ResourceType + role: Role diff --git a/tds/modules/person/response.py b/tds/modules/person/response.py new file mode 100644 index 000000000..d21041894 --- /dev/null +++ b/tds/modules/person/response.py @@ -0,0 +1,26 @@ +""" +TDS Person Response object. +""" +from typing import Optional + +from pydantic import BaseModel + + +class PersonResponse(BaseModel): + """ + Person Response Object. + """ + + id: int + name: str + email: str + org: Optional[str] + website: Optional[str] + is_registered: bool + + +def person_response(person_list): + """ + Function builds list of persons for response. + """ + return [PersonResponse(**x["_source"]) for x in person_list] From 2b9adfa050766bfbc834956d2cf1f04ed8a195df Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 08:51:02 -0700 Subject: [PATCH 016/140] Removed TDS from modules. --- tds/modules/concept/__init__.py | 2 +- tds/modules/dataset/__init__.py | 2 +- tds/modules/model/__init__.py | 2 +- tds/modules/workflow/__init__.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tds/modules/concept/__init__.py b/tds/modules/concept/__init__.py index 57a8ce555..002742abc 100644 --- a/tds/modules/concept/__init__.py +++ b/tds/modules/concept/__init__.py @@ -4,4 +4,4 @@ from tds.modules.concept.controller import concept_router as router ROUTE_PREFIX = "concepts" -TAGS = ["TDS Concepts"] +TAGS = ["Concepts"] diff --git a/tds/modules/dataset/__init__.py b/tds/modules/dataset/__init__.py index dbd7e9ea6..92a12e859 100644 --- a/tds/modules/dataset/__init__.py +++ b/tds/modules/dataset/__init__.py @@ -4,4 +4,4 @@ from tds.modules.dataset.controller import dataset_router as router ROUTE_PREFIX = "datasets" -TAGS = ["TDS Dataset"] +TAGS = ["Dataset"] diff --git a/tds/modules/model/__init__.py b/tds/modules/model/__init__.py index 7d839c1f5..03e62643f 100644 --- a/tds/modules/model/__init__.py +++ b/tds/modules/model/__init__.py @@ -4,4 +4,4 @@ from tds.modules.model.controller import model_router as router ROUTE_PREFIX = "models" -TAGS = ["TDS Model"] +TAGS = ["Model"] diff --git a/tds/modules/workflow/__init__.py b/tds/modules/workflow/__init__.py index 6b5021de9..36b92684f 100644 --- a/tds/modules/workflow/__init__.py +++ b/tds/modules/workflow/__init__.py @@ -7,4 +7,4 @@ from tds.modules.workflow.controller import workflow_router as router ROUTE_PREFIX = "workflows" -TAGS = ["TDS Workflow"] +TAGS = ["Workflow"] From a6d2a0263a107492ee85051d1462f483773ab89e Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 08:51:38 -0700 Subject: [PATCH 017/140] Moved QualifierXref to Dataset model file. --- tds/modules/dataset/model.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/tds/modules/dataset/model.py b/tds/modules/dataset/model.py index 25552988d..838347dec 100644 --- a/tds/modules/dataset/model.py +++ b/tds/modules/dataset/model.py @@ -7,11 +7,9 @@ from pydantic import AnyUrl, BaseModel, Field +from tds.autogen.orm import Base from tds.db.base import TdsModel -# from sqlalchemy.orm import Session -# from tds.db.relational import engine as pg_engine - class ColumnTypes(str, Enum): """Column type enum""" @@ -187,3 +185,17 @@ class Config: # def _establish_provenance(self): # pass + + +class QualifierXref(Base): + """ + QualifierXref Data Model. + """ + + __tablename__ = "qualifier_xref" + + id = sa.Column(sa.Integer(), primary_key=True) + qualifier_id = sa.Column( + sa.Integer(), sa.ForeignKey("qualifier.id"), nullable=False + ) + feature_id = sa.Column(sa.Integer(), sa.ForeignKey("feature.id"), nullable=False) From 1cdb15b18f1aaff9960fc0fb516a53df1b8fc991 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 08:56:45 -0700 Subject: [PATCH 018/140] Updated dataset lib with new QualifierXref location. --- tds/lib/datasets.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/tds/lib/datasets.py b/tds/lib/datasets.py index 48156b54b..1678f17b0 100644 --- a/tds/lib/datasets.py +++ b/tds/lib/datasets.py @@ -9,6 +9,7 @@ from sqlalchemy.orm import Session from tds.autogen import orm, schema +from tds.modules.dataset.model import QualifierXref logger = Logger(__file__) @@ -19,9 +20,7 @@ def get_qualifier_xrefs(count: int, rdb: Engine): """ with Session(rdb) as session: result = ( - session.query(orm.QualifierXref) - .order_by(orm.QualifierXref.id.asc()) - .limit(count) + session.query(QualifierXref).order_by(QualifierXref.id.asc()).limit(count) ) result = result[::] return result @@ -32,7 +31,7 @@ def get_qualifier_xref(id: int, rdb: Engine) -> str: Get a specific qualifier xref by ID """ with Session(rdb) as session: - result = session.query(orm.QualifierXref).get(id) + result = session.query(QualifierXref).get(id) return result @@ -49,9 +48,9 @@ def create_qualifier_xref(payload: schema.QualifierXref, rdb: Engine): qualifier_xrefp = payload logger.info("Set qualifier_xref to raw payload.") del qualifier_xrefp["id"] - qualifier_xref = orm.QualifierXref(**qualifier_xrefp) + qualifier_xref = QualifierXref(**qualifier_xrefp) exists = ( - session.query(orm.QualifierXref).filter_by(**qualifier_xrefp).first() + session.query(QualifierXref).filter_by(**qualifier_xrefp).first() is not None ) if exists: @@ -72,9 +71,7 @@ def update_qualifier_xref(payload: schema.Qualifier, id: int, rdb: Engine) -> st data_payload["id"] = id logger.info(data_payload) - data_to_update = session.query(orm.QualifierXref).filter( - orm.QualifierXref.id == id - ) + data_to_update = session.query(QualifierXref).filter(QualifierXref.id == id) data_to_update.update(data_payload) session.commit() return "Updated Qualifier xref" @@ -85,5 +82,5 @@ def delete_qualifier_xref(id: int, rdb: Engine) -> str: Delete a qualifier xref by ID """ with Session(rdb) as session: - session.query(orm.QualifierXref).filter(orm.QualifierXref.id == id).delete() + session.query(QualifierXref).filter(QualifierXref.id == id).delete() session.commit() From a943c9a741d4aa46385c77291b56f32fd793a73b Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 08:57:25 -0700 Subject: [PATCH 019/140] Removed QualifierXref and external classes from ORM. --- tds/autogen/orm.py | 39 --------------------------------------- 1 file changed, 39 deletions(-) diff --git a/tds/autogen/orm.py b/tds/autogen/orm.py index 12757e9e2..198f09fae 100644 --- a/tds/autogen/orm.py +++ b/tds/autogen/orm.py @@ -13,16 +13,6 @@ Base = declarative_base() -class QualifierXref(Base): - __tablename__ = "qualifier_xref" - - id = sa.Column(sa.Integer(), primary_key=True) - qualifier_id = sa.Column( - sa.Integer(), sa.ForeignKey("qualifier.id"), nullable=False - ) - feature_id = sa.Column(sa.Integer(), sa.ForeignKey("feature.id"), nullable=False) - - class Feature(Base): __tablename__ = "feature" @@ -44,18 +34,6 @@ class Qualifier(Base): value_type = sa.Column(sa.Enum(ValueType), nullable=False) -class Extraction(Base): - __tablename__ = "extraction" - - id = sa.Column(sa.Integer(), primary_key=True) - publication_id = sa.Column( - sa.Integer(), sa.ForeignKey("publication.id"), nullable=False - ) - type = sa.Column(sa.Enum(ExtractedType), nullable=False) - data = sa.Column(sa.LargeBinary(), nullable=False) - img = sa.Column(sa.LargeBinary(), nullable=False) - - class ModelFramework(Base): __tablename__ = "model_framework" @@ -63,20 +41,3 @@ class ModelFramework(Base): version = sa.Column(sa.String(), nullable=False) semantics = sa.Column(sa.String(), nullable=False) schema_url = sa.Column(sa.String()) - - -class Software(Base): - __tablename__ = "software" - - id = sa.Column(sa.Integer(), primary_key=True) - timestamp = sa.Column(sa.DateTime(), nullable=False, server_default=func.now()) - source = sa.Column(sa.String(), nullable=False) - storage_uri = sa.Column(sa.String(), nullable=False) - - -class Publication(Base): - __tablename__ = "publication" - - id = sa.Column(sa.Integer(), primary_key=True) - xdd_uri = sa.Column(sa.String(), nullable=False) - title = sa.Column(sa.String(), nullable=False) From 92033283c75e236c7def15ecef95df75306dc116 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 10:28:57 -0700 Subject: [PATCH 020/140] Removed Qualifier from orm. --- tds/autogen/orm.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/tds/autogen/orm.py b/tds/autogen/orm.py index 9a9adbe54..66d3b6ba2 100644 --- a/tds/autogen/orm.py +++ b/tds/autogen/orm.py @@ -23,16 +23,6 @@ class Feature(Base): value_type = sa.Column(sa.Enum(ValueType), nullable=False) -class Qualifier(Base): - __tablename__ = "qualifier" - - id = sa.Column(sa.Integer(), primary_key=True) - dataset_id = sa.Column(sa.Integer(), sa.ForeignKey("dataset.id"), nullable=False) - description = sa.Column(sa.Text()) - name = sa.Column(sa.String(), nullable=False) - value_type = sa.Column(sa.Enum(ValueType), nullable=False) - - class ModelFramework(Base): __tablename__ = "model_framework" From 8f54f970458702f7c76a7f66b802f6d6bd63f059 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 10:29:16 -0700 Subject: [PATCH 021/140] Removed unused classes from schema. --- tds/autogen/schema.py | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/tds/autogen/schema.py b/tds/autogen/schema.py index 408cb6747..5449fd34a 100644 --- a/tds/autogen/schema.py +++ b/tds/autogen/schema.py @@ -12,20 +12,6 @@ from tds.autogen.enums import ExtractedType, OntologicalField, TaggableType, ValueType -class QualifierXref(BaseModel): - id: Optional[int] = None - qualifier_id: Optional[int] = None - feature_id: Optional[int] = None - - -class ModelRuntime(BaseModel): - id: Optional[int] = None - timestamp: datetime.datetime = datetime.datetime.now() - name: str - left: str - right: str - - class Feature(BaseModel): id: Optional[int] = None dataset_id: Optional[int] = None @@ -51,14 +37,6 @@ class Extraction(BaseModel): img: bytes -class OntologyConcept(BaseModel): - id: Optional[int] = None - curie: str - type: TaggableType - object_id: str - status: OntologicalField - - class ModelFramework(BaseModel): name: str version: str From 93652ea32190e9843c62708e5413461ecbbbb5e5 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 10:29:48 -0700 Subject: [PATCH 022/140] Added Qualifier class to Dataset model file. --- tds/modules/dataset/model.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tds/modules/dataset/model.py b/tds/modules/dataset/model.py index 838347dec..a98efd08e 100644 --- a/tds/modules/dataset/model.py +++ b/tds/modules/dataset/model.py @@ -5,10 +5,12 @@ from enum import Enum from typing import Any, List, Optional +import sqlalchemy as sa from pydantic import AnyUrl, BaseModel, Field from tds.autogen.orm import Base from tds.db.base import TdsModel +from tds.db.enums import ValueType class ColumnTypes(str, Enum): @@ -199,3 +201,13 @@ class QualifierXref(Base): sa.Integer(), sa.ForeignKey("qualifier.id"), nullable=False ) feature_id = sa.Column(sa.Integer(), sa.ForeignKey("feature.id"), nullable=False) + + +class Qualifier(Base): + __tablename__ = "qualifier" + + id = sa.Column(sa.Integer(), primary_key=True) + dataset_id = sa.Column(sa.Integer(), sa.ForeignKey("dataset.id"), nullable=False) + description = sa.Column(sa.Text()) + name = sa.Column(sa.String(), nullable=False) + value_type = sa.Column(sa.Enum(ValueType), nullable=False) From 166fc728569e0297b0c7832a32e065011de126c6 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 10:30:16 -0700 Subject: [PATCH 023/140] More ORM/Schema updates. --- tds/modules/concept/controller.py | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/tds/modules/concept/controller.py b/tds/modules/concept/controller.py index 32cd61464..07c094740 100644 --- a/tds/modules/concept/controller.py +++ b/tds/modules/concept/controller.py @@ -12,8 +12,9 @@ from sqlalchemy.engine.base import Engine from sqlalchemy.orm import Session -from tds.autogen import orm, schema +from tds.autogen import orm from tds.db import request_rdb +from tds.db.enums import TaggableType from tds.lib.concepts import fetch_from_dkg, mark_concept_active from tds.modules.concept.model import ( ActiveConcept, @@ -21,8 +22,10 @@ OntologyConceptPayload, ) from tds.modules.dataset.model import Dataset +from tds.modules.external.model import Publication from tds.modules.model.model import Model from tds.modules.model_configuration.model import ModelConfiguration +from tds.modules.project.model import Project from tds.modules.simulation.model import Simulation logger = Logger(__file__) @@ -73,26 +76,26 @@ def get_concept_definition(curie: str): return fetch_from_dkg(params) -def get_taggable_orm(taggable_type: schema.TaggableType): +def get_taggable_orm(taggable_type: TaggableType): """ Maps resource type to ORM """ enum_to_orm = { - schema.TaggableType.features: orm.Feature, - schema.TaggableType.qualifiers: orm.Qualifier, - schema.TaggableType.datasets: Dataset, - schema.TaggableType.model_configurations: ModelConfiguration, - schema.TaggableType.models: Model, - schema.TaggableType.projects: orm.Project, - schema.TaggableType.publications: orm.Publication, - schema.TaggableType.simulations: Simulation, + TaggableType.features: orm.Feature, + TaggableType.qualifiers: orm.Qualifier, + TaggableType.datasets: Dataset, + TaggableType.model_configurations: ModelConfiguration, + TaggableType.models: Model, + TaggableType.projects: Project, + TaggableType.publications: Publication, + TaggableType.simulations: Simulation, } return enum_to_orm[taggable_type] @concept_router.get("/facets") def search_concept_using_facets( - types: List[schema.TaggableType] = Query(default=list(schema.TaggableType)), + types: List[TaggableType] = Query(default=list(TaggableType)), curies: Optional[List[str]] = Query(default=None), is_simulation: Optional[bool] = Query(default=None), rdb: Engine = Depends(request_rdb), @@ -110,13 +113,13 @@ def search_concept_using_facets( base_query = base_query.join( Dataset, and_( - OntologyConcept.type == schema.TaggableType.datasets, + OntologyConcept.type == TaggableType.datasets, OntologyConcept.object_id == Dataset.id, ), isouter=True, ).filter( or_( - OntologyConcept.type != schema.TaggableType.datasets, + OntologyConcept.type != TaggableType.datasets, Dataset.simulation_run == is_simulation, ) ) From 06a00708fdd1f6f845ff2ee69266fae2ef964810 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 10:31:20 -0700 Subject: [PATCH 024/140] Fixed linter issue. --- tds/modules/dataset/model.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tds/modules/dataset/model.py b/tds/modules/dataset/model.py index a98efd08e..08b7c236c 100644 --- a/tds/modules/dataset/model.py +++ b/tds/modules/dataset/model.py @@ -204,6 +204,10 @@ class QualifierXref(Base): class Qualifier(Base): + """ + Qualifier Data Model. + """ + __tablename__ = "qualifier" id = sa.Column(sa.Integer(), primary_key=True) From 21ee0905a5547acbc2d891164614548c32504c2a Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 10:32:52 -0700 Subject: [PATCH 025/140] Moved column types to new enum file. --- tds/modules/dataset/model.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tds/modules/dataset/model.py b/tds/modules/dataset/model.py index 08b7c236c..cc45fe735 100644 --- a/tds/modules/dataset/model.py +++ b/tds/modules/dataset/model.py @@ -2,7 +2,6 @@ TDS Dataset """ from datetime import datetime -from enum import Enum from typing import Any, List, Optional import sqlalchemy as sa From c4e4180514d7ca86296561823ea23426f830f084 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 10:37:28 -0700 Subject: [PATCH 026/140] Moved enums to db package. --- tds/autogen/orm.py | 2 +- tds/autogen/schema.py | 2 +- tds/{autogen => db}/enums.py | 15 +++++++++++++++ tds/db/graph/query_helpers.py | 2 +- tds/modules/concept/model.py | 2 +- tds/modules/dataset/model.py | 19 +------------------ tds/modules/person/model.py | 2 +- tds/modules/project/controller.py | 2 +- tds/modules/project/model.py | 2 +- tds/modules/provenance/controller.py | 3 +-- tds/modules/provenance/model.py | 2 +- tds/modules/provenance/response.py | 2 +- tds/modules/simulation/model.py | 2 +- tds/modules/simulation/response.py | 2 +- tds/schema/provenance.py | 2 +- tds/schema/resource.py | 2 +- 16 files changed, 30 insertions(+), 33 deletions(-) rename tds/{autogen => db}/enums.py (91%) diff --git a/tds/autogen/orm.py b/tds/autogen/orm.py index 66d3b6ba2..8ba8dba08 100644 --- a/tds/autogen/orm.py +++ b/tds/autogen/orm.py @@ -7,7 +7,7 @@ import sqlalchemy as sa from sqlalchemy.ext.declarative import declarative_base -from tds.autogen.enums import ValueType +from tds.db.enums import ValueType Base = declarative_base() diff --git a/tds/autogen/schema.py b/tds/autogen/schema.py index 5449fd34a..eb7e9730f 100644 --- a/tds/autogen/schema.py +++ b/tds/autogen/schema.py @@ -9,7 +9,7 @@ from pydantic import BaseModel -from tds.autogen.enums import ExtractedType, OntologicalField, TaggableType, ValueType +from tds.db.enums import ExtractedType, ValueType class Feature(BaseModel): diff --git a/tds/autogen/enums.py b/tds/db/enums.py similarity index 91% rename from tds/autogen/enums.py rename to tds/db/enums.py index efa5826c7..de66e039a 100644 --- a/tds/autogen/enums.py +++ b/tds/db/enums.py @@ -129,3 +129,18 @@ class SimulationStatus(str, Enum): queued = "queued" running = "running" failed = "failed" + + +class ColumnTypes(str, Enum): + UNKNOWN = "unknown" + BOOLEAN = "boolean" + STRING = "string" + CHAR = "string" + INTEGER = "integer" + INT = "integer" + FLOAT = "float" + DOUBLE = "double" + TIMESTAMP = "timestamp" + DATETIME = "datetime" + DATE = "date" + TIME = "time" diff --git a/tds/db/graph/query_helpers.py b/tds/db/graph/query_helpers.py index 9d48a2df4..4c8e210ab 100644 --- a/tds/db/graph/query_helpers.py +++ b/tds/db/graph/query_helpers.py @@ -6,7 +6,7 @@ from fastapi import HTTPException from tds.autogen import schema -from tds.autogen.enums import ProvenanceType +from tds.db.enums import ProvenanceType from tds.schema.provenance import provenance_type_to_abbr diff --git a/tds/modules/concept/model.py b/tds/modules/concept/model.py index 789b3bb53..f6715f8e6 100644 --- a/tds/modules/concept/model.py +++ b/tds/modules/concept/model.py @@ -6,8 +6,8 @@ import sqlalchemy as sa from pydantic import BaseModel -from tds.autogen.enums import OntologicalField, TaggableType from tds.autogen.orm import Base +from tds.db.enums import OntologicalField, TaggableType class OntologyConcept(Base): diff --git a/tds/modules/dataset/model.py b/tds/modules/dataset/model.py index cc45fe735..c214518c9 100644 --- a/tds/modules/dataset/model.py +++ b/tds/modules/dataset/model.py @@ -9,24 +9,7 @@ from tds.autogen.orm import Base from tds.db.base import TdsModel -from tds.db.enums import ValueType - - -class ColumnTypes(str, Enum): - """Column type enum""" - - UNKNOWN = "unknown" - BOOLEAN = "boolean" - STRING = "string" - CHAR = "string" - INTEGER = "integer" - INT = "integer" - FLOAT = "float" - DOUBLE = "double" - TIMESTAMP = "timestamp" - DATETIME = "datetime" - DATE = "date" - TIME = "time" +from tds.db.enums import ColumnTypes, ValueType class Grounding(BaseModel): diff --git a/tds/modules/person/model.py b/tds/modules/person/model.py index ddeb4dfd6..7e776dbb9 100644 --- a/tds/modules/person/model.py +++ b/tds/modules/person/model.py @@ -7,8 +7,8 @@ from pydantic import BaseModel from sqlalchemy.orm import relationship -from tds.autogen.enums import ResourceType, Role from tds.autogen.orm import Base +from tds.db.enums import ResourceType, Role class Person(Base): diff --git a/tds/modules/project/controller.py b/tds/modules/project/controller.py index 7ed84ab2f..1fd56998a 100644 --- a/tds/modules/project/controller.py +++ b/tds/modules/project/controller.py @@ -13,8 +13,8 @@ from sqlalchemy.engine.base import Engine from sqlalchemy.orm import Query, Session -from tds.autogen.enums import ResourceType from tds.db import entry_exists, es_client, request_rdb +from tds.db.enums import ResourceType from tds.modules.project.helpers import ( ResourceDoesNotExist, adjust_project_assets, diff --git a/tds/modules/project/model.py b/tds/modules/project/model.py index 2b7882a60..c57974874 100644 --- a/tds/modules/project/model.py +++ b/tds/modules/project/model.py @@ -8,8 +8,8 @@ from sqlalchemy.orm import relationship from sqlalchemy.sql import func -from tds.autogen.enums import ResourceType from tds.autogen.orm import Base +from tds.db.enums import ResourceType class Project(Base): diff --git a/tds/modules/provenance/controller.py b/tds/modules/provenance/controller.py index 64596f50b..285b76282 100644 --- a/tds/modules/provenance/controller.py +++ b/tds/modules/provenance/controller.py @@ -12,8 +12,7 @@ from sqlalchemy.orm import Session from sqlalchemy.orm.exc import NoResultFound -from tds.autogen import enums -from tds.db import request_graph_db, request_rdb +from tds.db import enums, request_graph_db, request_rdb from tds.db.graph.provenance_handler import ProvenanceHandler from tds.db.graph.search_provenance import SearchProvenance from tds.modules.provenance.model import Provenance, ProvenancePayload, ProvenanceSearch diff --git a/tds/modules/provenance/model.py b/tds/modules/provenance/model.py index 30295832b..09d261b39 100644 --- a/tds/modules/provenance/model.py +++ b/tds/modules/provenance/model.py @@ -9,8 +9,8 @@ from pydantic.main import BaseModel from sqlalchemy import func -from tds.autogen.enums import ProvenanceType, RelationType from tds.autogen.orm import Base +from tds.db.enums import ProvenanceType, RelationType class Provenance(Base): diff --git a/tds/modules/provenance/response.py b/tds/modules/provenance/response.py index 8fb9f2380..144e54041 100644 --- a/tds/modules/provenance/response.py +++ b/tds/modules/provenance/response.py @@ -6,7 +6,7 @@ from pydantic import BaseModel -from tds.autogen.enums import ProvenanceType, RelationType +from tds.db.enums import ProvenanceType, RelationType class ProvenanceResponse(BaseModel): diff --git a/tds/modules/simulation/model.py b/tds/modules/simulation/model.py index 958c0efa5..c2581f952 100644 --- a/tds/modules/simulation/model.py +++ b/tds/modules/simulation/model.py @@ -6,8 +6,8 @@ from pydantic import BaseModel, Field -from tds.autogen.enums import SimulationEngine, SimulationStatus, SimulationType from tds.db.base import TdsModel +from tds.db.enums import SimulationEngine, SimulationStatus, SimulationType from tds.settings import settings diff --git a/tds/modules/simulation/response.py b/tds/modules/simulation/response.py index f1b255395..7701028e8 100644 --- a/tds/modules/simulation/response.py +++ b/tds/modules/simulation/response.py @@ -6,7 +6,7 @@ from pydantic import BaseModel -from tds.autogen.enums import SimulationEngine, SimulationStatus, SimulationType +from tds.db.enums import SimulationEngine, SimulationStatus, SimulationType from tds.modules.simulation.model import ExecutionPayload diff --git a/tds/schema/provenance.py b/tds/schema/provenance.py index 553ef226b..ad268a121 100644 --- a/tds/schema/provenance.py +++ b/tds/schema/provenance.py @@ -6,7 +6,7 @@ from pydantic import BaseModel, Field # pylint: disable=missing-class-docstring -from tds.autogen.enums import ProvenanceType +from tds.db.enums import ProvenanceType from tds.modules.provenance.model import Provenance as ProvenanceModel diff --git a/tds/schema/resource.py b/tds/schema/resource.py index 57e736f48..c20742fe5 100644 --- a/tds/schema/resource.py +++ b/tds/schema/resource.py @@ -7,7 +7,7 @@ from typing import Dict, Optional, Type from tds.autogen import orm, schema -from tds.autogen.enums import ResourceType +from tds.db.enums import ResourceType from tds.modules.artifact.model import Artifact from tds.modules.dataset.model import Dataset from tds.modules.model.model import Model From 8a95bd3d15ce7a24bcb5b835a16c4a20d6f5098f Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 10:40:45 -0700 Subject: [PATCH 027/140] Moved declaritive base to db package. --- tds/db/__init__.py | 4 ++++ tds/modules/concept/model.py | 2 +- tds/modules/dataset/model.py | 2 +- tds/modules/person/model.py | 2 +- tds/modules/project/model.py | 2 +- tds/modules/provenance/model.py | 2 +- 6 files changed, 9 insertions(+), 5 deletions(-) diff --git a/tds/db/__init__.py b/tds/db/__init__.py index 8db1da3a4..14de877f0 100644 --- a/tds/db/__init__.py +++ b/tds/db/__init__.py @@ -2,8 +2,12 @@ tds.db - DB handling """ +from sqlalchemy.ext.declarative import declarative_base + from tds.db.elasticsearch import es_client from tds.db.graph.neo4j import request_engine as request_graph_db from tds.db.helpers import drop_content, entry_exists, init_dev_content, list_by_id from tds.db.relational import engine as rdb from tds.db.relational import request_engine as request_rdb + +Base = declarative_base() diff --git a/tds/modules/concept/model.py b/tds/modules/concept/model.py index f6715f8e6..d2b9bc057 100644 --- a/tds/modules/concept/model.py +++ b/tds/modules/concept/model.py @@ -6,7 +6,7 @@ import sqlalchemy as sa from pydantic import BaseModel -from tds.autogen.orm import Base +from tds.db import Base from tds.db.enums import OntologicalField, TaggableType diff --git a/tds/modules/dataset/model.py b/tds/modules/dataset/model.py index c214518c9..b74ff8e90 100644 --- a/tds/modules/dataset/model.py +++ b/tds/modules/dataset/model.py @@ -7,7 +7,7 @@ import sqlalchemy as sa from pydantic import AnyUrl, BaseModel, Field -from tds.autogen.orm import Base +from tds.db import Base from tds.db.base import TdsModel from tds.db.enums import ColumnTypes, ValueType diff --git a/tds/modules/person/model.py b/tds/modules/person/model.py index 7e776dbb9..0d6c2a242 100644 --- a/tds/modules/person/model.py +++ b/tds/modules/person/model.py @@ -7,7 +7,7 @@ from pydantic import BaseModel from sqlalchemy.orm import relationship -from tds.autogen.orm import Base +from tds.db import Base from tds.db.enums import ResourceType, Role diff --git a/tds/modules/project/model.py b/tds/modules/project/model.py index c57974874..eb4556f43 100644 --- a/tds/modules/project/model.py +++ b/tds/modules/project/model.py @@ -8,7 +8,7 @@ from sqlalchemy.orm import relationship from sqlalchemy.sql import func -from tds.autogen.orm import Base +from tds.db import Base from tds.db.enums import ResourceType diff --git a/tds/modules/provenance/model.py b/tds/modules/provenance/model.py index 09d261b39..f0715918e 100644 --- a/tds/modules/provenance/model.py +++ b/tds/modules/provenance/model.py @@ -9,7 +9,7 @@ from pydantic.main import BaseModel from sqlalchemy import func -from tds.autogen.orm import Base +from tds.db import Base from tds.db.enums import ProvenanceType, RelationType From 0ace1febc0736dd7375d04831ec48de069556cce Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 10:55:20 -0700 Subject: [PATCH 028/140] Removed orm from seed_data script. --- migrate/scripts/seed_data.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/migrate/scripts/seed_data.py b/migrate/scripts/seed_data.py index 1adc870f2..8013c05d0 100644 --- a/migrate/scripts/seed_data.py +++ b/migrate/scripts/seed_data.py @@ -11,7 +11,10 @@ from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import Session -from tds.autogen import orm +from tds.modules.external.model import Publication +from tds.modules.model.model import ModelFramework +from tds.modules.person.model import Person +from tds.modules.project.model import Project, ProjectAsset from tds.modules.provenance.model import Provenance migrate_dir = Path(os.path.dirname(__file__)) @@ -24,12 +27,12 @@ SQL_DB = os.getenv("SQL_DB") pg_data_load = { - "model_framework": orm.ModelFramework, - "persons": orm.Person, - "projects": orm.Project, - "project_assets": orm.ProjectAsset, + "model_framework": ModelFramework, + "persons": Person, + "projects": Project, + "project_assets": ProjectAsset, "provenance": Provenance, - "publications": orm.Publication, + "publications": Publication, } From 0154cd7dbfc074941a0e4751437a2a9f30f8dd52 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 10:56:09 -0700 Subject: [PATCH 029/140] More items removed from orm and schema files. --- tds/autogen/orm.py | 9 --------- tds/autogen/schema.py | 32 +------------------------------- 2 files changed, 1 insertion(+), 40 deletions(-) diff --git a/tds/autogen/orm.py b/tds/autogen/orm.py index 8ba8dba08..2037275af 100644 --- a/tds/autogen/orm.py +++ b/tds/autogen/orm.py @@ -21,12 +21,3 @@ class Feature(Base): display_name = sa.Column(sa.String()) name = sa.Column(sa.String(), nullable=False) value_type = sa.Column(sa.Enum(ValueType), nullable=False) - - -class ModelFramework(Base): - __tablename__ = "model_framework" - - name = sa.Column(sa.String(), primary_key=True) - version = sa.Column(sa.String(), nullable=False) - semantics = sa.Column(sa.String(), nullable=False) - schema_url = sa.Column(sa.String()) diff --git a/tds/autogen/schema.py b/tds/autogen/schema.py index eb7e9730f..0840bf4b9 100644 --- a/tds/autogen/schema.py +++ b/tds/autogen/schema.py @@ -4,12 +4,11 @@ Skipping linter to prevent class docstring errors. @TODO: Clean up file to pass linting. """ -import datetime from typing import Optional from pydantic import BaseModel -from tds.db.enums import ExtractedType, ValueType +from tds.db.enums import ValueType class Feature(BaseModel): @@ -27,32 +26,3 @@ class Qualifier(BaseModel): description: Optional[str] name: str value_type: ValueType - - -class Extraction(BaseModel): - id: Optional[int] = None - publication_id: Optional[int] = None - type: ExtractedType - data: bytes - img: bytes - - -class ModelFramework(BaseModel): - name: str - version: str - semantics: str - schema_url: Optional[str] - - -class Software(BaseModel): - id: Optional[int] = None - timestamp: datetime.datetime = datetime.datetime.now() - source: str - storage_uri: str - - -class Publication(BaseModel): - id: Optional[int] = None - xdd_uri: str - title: str - publication_data: Optional[dict] From 928aa3c47f8b0596f2f70265725496b97500c84c Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 10:56:53 -0700 Subject: [PATCH 030/140] Added model framework to model model file. --- tds/modules/model/model.py | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/tds/modules/model/model.py b/tds/modules/model/model.py index 4c1a5dfa0..d59cdcf83 100644 --- a/tds/modules/model/model.py +++ b/tds/modules/model/model.py @@ -3,9 +3,11 @@ """ from typing import List, Optional -from pydantic import Field +import sqlalchemy as sa +from pydantic import BaseModel, Field from sqlalchemy.orm import Session +from tds.db import Base from tds.db.base import TdsModel from tds.db.relational import engine as pg_engine from tds.lib.concepts import mark_concept_active @@ -113,3 +115,27 @@ class Config: """ schema_extra = {"example": model_config} + + +class ModelFramework(Base): + """ + ModelFramework Data Model. + """ + + __tablename__ = "model_framework" + + name = sa.Column(sa.String(), primary_key=True) + version = sa.Column(sa.String(), nullable=False) + semantics = sa.Column(sa.String(), nullable=False) + schema_url = sa.Column(sa.String()) + + +class ModelFrameworkPayload(BaseModel): + """ + ModelFrameworkPayload Model. + """ + + name: str + version: str + semantics: str + schema_url: Optional[str] From f8097fcc4ed7cb748537e4ea753d6412845118c1 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 10:57:17 -0700 Subject: [PATCH 031/140] Updated model framework location. --- tests/service.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/service.py b/tests/service.py index 43730302a..550699b11 100644 --- a/tests/service.py +++ b/tests/service.py @@ -7,8 +7,8 @@ from sqlalchemy.orm import Session from tds.autogen import orm -from tds.autogen.schema import ResourceType, ValueType -from tds.schema.model import ModelFramework +from tds.db.enums import ResourceType, ValueType +from tds.modules.model.model import ModelFramework from tds.schema.resource import Publication, Software from tests.suite import AllowedMethod from tests.suite import ASKEMEntityTestSuite as AETS @@ -22,7 +22,7 @@ class TestProject(AETS): def init_test_data(self): with Session(self.rdb) as session: # Arrange Models - framework = orm.ModelFramework(name="dummy", version="v0", semantics="") + framework = ModelFramework(name="dummy", version="v0", semantics="") session.add(framework) session.commit() state = orm.ModelState(content="") @@ -126,7 +126,7 @@ class TestRun(AETS): def init_test_data(self): with Session(self.rdb) as session: # Arrange Model - framework = orm.ModelFramework(name="dummy", version="v0", semantics="") + framework = ModelFramework(name="dummy", version="v0", semantics="") session.add(framework) session.commit() state = orm.ModelState(content="") @@ -215,7 +215,7 @@ class TestModelConfig(AETS): def init_test_data(self): with Session(self.rdb) as session: # Arrange Model - framework = orm.ModelFramework(name="dummy", version="v0", semantics="") + framework = ModelFramework(name="dummy", version="v0", semantics="") session.add(framework) session.commit() state = orm.ModelState(content="") @@ -284,7 +284,7 @@ class TestModel(AETS): def init_test_data(self): with Session(self.rdb) as session: - framework = orm.ModelFramework(name="dummy", version="v0", semantics="") + framework = ModelFramework(name="dummy", version="v0", semantics="") session.add(framework) session.commit() state = orm.ModelState(content="") @@ -375,7 +375,7 @@ class TestFramework(AETS): def init_test_data(self): with Session(self.rdb) as session: - framework = orm.ModelFramework(name="dummy", version="v0", semantics="") + framework = ModelFramework(name="dummy", version="v0", semantics="") session.add(framework) session.commit() From 8d7b0ba9edd7f7fca17831b2ec9c6e312b611b96 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 10:57:50 -0700 Subject: [PATCH 032/140] Updated more framework locations. --- tds/routers/models.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/tds/routers/models.py b/tds/routers/models.py index 932f48ce9..f69319499 100644 --- a/tds/routers/models.py +++ b/tds/routers/models.py @@ -9,10 +9,9 @@ from sqlalchemy.engine.base import Engine from sqlalchemy.orm import Session -from tds.autogen import orm from tds.db import request_rdb +from tds.modules.model.model import ModelFramework, ModelFrameworkPayload from tds.operation import create, delete, retrieve -from tds.schema.model import ModelFramework logger = Logger(__name__) router = APIRouter() @@ -20,7 +19,7 @@ @router.post("/frameworks", **create.fastapi_endpoint_config) def create_framework( - payload: ModelFramework, rdb: Engine = Depends(request_rdb) + payload: ModelFrameworkPayload, rdb: Engine = Depends(request_rdb) ) -> Response: """ Create framework metadata @@ -28,7 +27,7 @@ def create_framework( with Session(rdb) as session: framework_payload = payload.dict() - framework = orm.ModelFramework(**framework_payload) + framework = ModelFramework(**framework_payload) session.add(framework) session.commit() name: str = framework.name @@ -49,12 +48,10 @@ def get_framework(name: str, rdb: Engine = Depends(request_rdb)) -> ModelFramewo """ with Session(rdb) as session: if ( - session.query(orm.ModelFramework) - .filter(orm.ModelFramework.name == name) - .count() + session.query(ModelFramework).filter(ModelFramework.name == name).count() == 1 ): - return ModelFramework.from_orm(session.query(orm.ModelFramework).get(name)) + return ModelFramework.from_orm(session.query(ModelFramework).get(name)) raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) @@ -65,12 +62,10 @@ def delete_framework(name: str, rdb: Engine = Depends(request_rdb)) -> Response: """ with Session(rdb) as session: if ( - session.query(orm.ModelFramework) - .filter(orm.ModelFramework.name == name) - .count() + session.query(ModelFramework).filter(ModelFramework.name == name).count() == 1 ): - framework = session.query(orm.ModelFramework).get(name) + framework = session.query(ModelFramework).get(name) session.delete(framework) session.commit() else: From f1ae0e2da80c37c3ea22a7fd65b504868e9bb666 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 10:59:19 -0700 Subject: [PATCH 033/140] Fixed enum location. --- tds/db/graph/query_helpers.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tds/db/graph/query_helpers.py b/tds/db/graph/query_helpers.py index 4c8e210ab..154dda749 100644 --- a/tds/db/graph/query_helpers.py +++ b/tds/db/graph/query_helpers.py @@ -5,8 +5,7 @@ from fastapi import HTTPException -from tds.autogen import schema -from tds.db.enums import ProvenanceType +from tds.db.enums import ProvenanceType, RelationType from tds.schema.provenance import provenance_type_to_abbr @@ -109,13 +108,13 @@ def relationships_array_as_str(exclude=None, include=None): """ relationship_str = "" if exclude is not None: - for type_ in schema.RelationType: + for type_ in RelationType: value = type_.value if value in exclude: continue relationship_str += value + "|" return relationship_str[:-1] - for type_ in schema.RelationType: + for type_ in RelationType: value = type_.value if value in include: relationship_str += value + "|" From 4498d04557953f2c17c6ccca7e58b03b2d7fac9e Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 11:00:41 -0700 Subject: [PATCH 034/140] Updated base location in db helpers. --- tds/db/helpers.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tds/db/helpers.py b/tds/db/helpers.py index 64e17f636..7a25544af 100644 --- a/tds/db/helpers.py +++ b/tds/db/helpers.py @@ -6,21 +6,21 @@ from sqlalchemy.engine.base import Connection from sqlalchemy.orm import Session -from tds.autogen import orm +from tds.db import Base def init_dev_content(connection: Connection): """ Initialize tables in the connected DB """ - orm.Base.metadata.create_all(connection) + Base.metadata.create_all(connection) def drop_content(connection: Connection): """ Drop all tables from the DB """ - return orm.Base.metadata.drop_all(connection) + return Base.metadata.drop_all(connection) def entry_exists(connection: Connection, orm_type: Any, orm_id: int) -> bool: From 36daa260f9bc6aa35b78f4f83c2c274bd6fd528b Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 11:03:13 -0700 Subject: [PATCH 035/140] Updated base location to prevent circular import. --- tds/db/__init__.py | 4 ---- tds/db/base.py | 2 ++ tds/db/helpers.py | 2 +- tds/modules/concept/model.py | 2 +- tds/modules/dataset/model.py | 3 +-- tds/modules/model/model.py | 3 +-- tds/modules/person/model.py | 2 +- tds/modules/project/model.py | 2 +- tds/modules/provenance/model.py | 2 +- 9 files changed, 9 insertions(+), 13 deletions(-) diff --git a/tds/db/__init__.py b/tds/db/__init__.py index 14de877f0..8db1da3a4 100644 --- a/tds/db/__init__.py +++ b/tds/db/__init__.py @@ -2,12 +2,8 @@ tds.db - DB handling """ -from sqlalchemy.ext.declarative import declarative_base - from tds.db.elasticsearch import es_client from tds.db.graph.neo4j import request_engine as request_graph_db from tds.db.helpers import drop_content, entry_exists, init_dev_content, list_by_id from tds.db.relational import engine as rdb from tds.db.relational import request_engine as request_rdb - -Base = declarative_base() diff --git a/tds/db/base.py b/tds/db/base.py index 9b2ac840b..7bfa1e007 100644 --- a/tds/db/base.py +++ b/tds/db/base.py @@ -7,11 +7,13 @@ from elasticsearch import ConflictError from pydantic import BaseModel, Field +from sqlalchemy.ext.declarative import declarative_base from tds.db import es_client from tds.settings import settings es = es_client() +Base = declarative_base() def new_uuid() -> str: diff --git a/tds/db/helpers.py b/tds/db/helpers.py index 7a25544af..cc44522c9 100644 --- a/tds/db/helpers.py +++ b/tds/db/helpers.py @@ -6,7 +6,7 @@ from sqlalchemy.engine.base import Connection from sqlalchemy.orm import Session -from tds.db import Base +from tds.db.base import Base def init_dev_content(connection: Connection): diff --git a/tds/modules/concept/model.py b/tds/modules/concept/model.py index d2b9bc057..c45126b99 100644 --- a/tds/modules/concept/model.py +++ b/tds/modules/concept/model.py @@ -6,7 +6,7 @@ import sqlalchemy as sa from pydantic import BaseModel -from tds.db import Base +from tds.db.base import Base from tds.db.enums import OntologicalField, TaggableType diff --git a/tds/modules/dataset/model.py b/tds/modules/dataset/model.py index b74ff8e90..d09702b5e 100644 --- a/tds/modules/dataset/model.py +++ b/tds/modules/dataset/model.py @@ -7,8 +7,7 @@ import sqlalchemy as sa from pydantic import AnyUrl, BaseModel, Field -from tds.db import Base -from tds.db.base import TdsModel +from tds.db.base import Base, TdsModel from tds.db.enums import ColumnTypes, ValueType diff --git a/tds/modules/model/model.py b/tds/modules/model/model.py index d59cdcf83..befab100c 100644 --- a/tds/modules/model/model.py +++ b/tds/modules/model/model.py @@ -7,8 +7,7 @@ from pydantic import BaseModel, Field from sqlalchemy.orm import Session -from tds.db import Base -from tds.db.base import TdsModel +from tds.db.base import Base, TdsModel from tds.db.relational import engine as pg_engine from tds.lib.concepts import mark_concept_active from tds.lib.model_configs import model_config diff --git a/tds/modules/person/model.py b/tds/modules/person/model.py index 0d6c2a242..f7e71de0d 100644 --- a/tds/modules/person/model.py +++ b/tds/modules/person/model.py @@ -7,7 +7,7 @@ from pydantic import BaseModel from sqlalchemy.orm import relationship -from tds.db import Base +from tds.db.base import Base from tds.db.enums import ResourceType, Role diff --git a/tds/modules/project/model.py b/tds/modules/project/model.py index eb4556f43..2b7002915 100644 --- a/tds/modules/project/model.py +++ b/tds/modules/project/model.py @@ -8,7 +8,7 @@ from sqlalchemy.orm import relationship from sqlalchemy.sql import func -from tds.db import Base +from tds.db.base import Base from tds.db.enums import ResourceType diff --git a/tds/modules/provenance/model.py b/tds/modules/provenance/model.py index f0715918e..4bec11b53 100644 --- a/tds/modules/provenance/model.py +++ b/tds/modules/provenance/model.py @@ -9,7 +9,7 @@ from pydantic.main import BaseModel from sqlalchemy import func -from tds.db import Base +from tds.db.base import Base from tds.db.enums import ProvenanceType, RelationType From 945daeb8854fdd6982dfd04c69def8048858fdc2 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 11:07:28 -0700 Subject: [PATCH 036/140] Moved Feature to Dataset model file. --- tds/autogen/orm.py | 11 ----------- tds/modules/concept/controller.py | 8 +++----- tds/modules/dataset/model.py | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/tds/autogen/orm.py b/tds/autogen/orm.py index 2037275af..7353a0517 100644 --- a/tds/autogen/orm.py +++ b/tds/autogen/orm.py @@ -10,14 +10,3 @@ from tds.db.enums import ValueType Base = declarative_base() - - -class Feature(Base): - __tablename__ = "feature" - - id = sa.Column(sa.Integer(), primary_key=True) - dataset_id = sa.Column(sa.Integer(), sa.ForeignKey("dataset.id"), nullable=False) - description = sa.Column(sa.Text()) - display_name = sa.Column(sa.String()) - name = sa.Column(sa.String(), nullable=False) - value_type = sa.Column(sa.Enum(ValueType), nullable=False) diff --git a/tds/modules/concept/controller.py b/tds/modules/concept/controller.py index 07c094740..18e9143f9 100644 --- a/tds/modules/concept/controller.py +++ b/tds/modules/concept/controller.py @@ -12,7 +12,6 @@ from sqlalchemy.engine.base import Engine from sqlalchemy.orm import Session -from tds.autogen import orm from tds.db import request_rdb from tds.db.enums import TaggableType from tds.lib.concepts import fetch_from_dkg, mark_concept_active @@ -21,7 +20,7 @@ OntologyConcept, OntologyConceptPayload, ) -from tds.modules.dataset.model import Dataset +from tds.modules.dataset.model import Dataset, Feature, Qualifier from tds.modules.external.model import Publication from tds.modules.model.model import Model from tds.modules.model_configuration.model import ModelConfiguration @@ -81,8 +80,8 @@ def get_taggable_orm(taggable_type: TaggableType): Maps resource type to ORM """ enum_to_orm = { - TaggableType.features: orm.Feature, - TaggableType.qualifiers: orm.Qualifier, + TaggableType.features: Feature, + TaggableType.qualifiers: Qualifier, TaggableType.datasets: Dataset, TaggableType.model_configurations: ModelConfiguration, TaggableType.models: Model, @@ -120,7 +119,6 @@ def search_concept_using_facets( ).filter( or_( OntologyConcept.type != TaggableType.datasets, - Dataset.simulation_run == is_simulation, ) ) result = { diff --git a/tds/modules/dataset/model.py b/tds/modules/dataset/model.py index d09702b5e..d36aa81bb 100644 --- a/tds/modules/dataset/model.py +++ b/tds/modules/dataset/model.py @@ -196,3 +196,18 @@ class Qualifier(Base): description = sa.Column(sa.Text()) name = sa.Column(sa.String(), nullable=False) value_type = sa.Column(sa.Enum(ValueType), nullable=False) + + +class Feature(Base): + """ + Feature Data Model. + """ + + __tablename__ = "feature" + + id = sa.Column(sa.Integer(), primary_key=True) + dataset_id = sa.Column(sa.Integer(), sa.ForeignKey("dataset.id"), nullable=False) + description = sa.Column(sa.Text()) + display_name = sa.Column(sa.String()) + name = sa.Column(sa.String(), nullable=False) + value_type = sa.Column(sa.Enum(ValueType), nullable=False) From baba4349c39da4709125453c324be1fb3d41229b Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 11:36:12 -0700 Subject: [PATCH 037/140] Updated project asset location. --- tds/lib/datasets.py | 2 +- tds/lib/projects.py | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/tds/lib/datasets.py b/tds/lib/datasets.py index 1678f17b0..7d11e5c11 100644 --- a/tds/lib/datasets.py +++ b/tds/lib/datasets.py @@ -8,7 +8,7 @@ from sqlalchemy.engine.base import Engine from sqlalchemy.orm import Session -from tds.autogen import orm, schema +from tds.autogen import schema from tds.modules.dataset.model import QualifierXref logger = Logger(__file__) diff --git a/tds/lib/projects.py b/tds/lib/projects.py index 9083ca5f6..c346d38b2 100644 --- a/tds/lib/projects.py +++ b/tds/lib/projects.py @@ -8,20 +8,21 @@ from sqlalchemy.orm import Session -from tds.autogen import orm, schema +from tds.db.enums import ResourceType +from tds.modules.project.model import ProjectAsset logger = Logger(__file__) def save_project_assets( - project_id: int, assets: Dict[schema.ResourceType, List[int]], session: Session + project_id: int, assets: Dict[ResourceType, List[int]], session: Session ): """ Save project assets to relational DB """ for resource_type, resource_ids in assets.items(): project_assets = [ - orm.ProjectAsset( + ProjectAsset( project_id=project_id, resource_id=resource_id, resource_type=resource_type, @@ -33,20 +34,20 @@ def save_project_assets( def adjust_project_assets( - project_id: int, assets: Dict[schema.ResourceType, List[int]], session: Session + project_id: int, assets: Dict[ResourceType, List[int]], session: Session ): """ Add new entries and remove unused entries """ active = defaultdict(list) - for asset in session.query(orm.ProjectAsset).filter( - orm.ProjectAsset.project_id == project_id + for asset in session.query(ProjectAsset).filter( + ProjectAsset.project_id == project_id ): active[asset.resource_type].append(asset.resource_id) for resource_type, resource_ids in assets.items(): project_assets = [ - orm.ProjectAsset( + ProjectAsset( project_id=project_id, resource_id=resource_id, resource_type=resource_type, @@ -60,4 +61,4 @@ def adjust_project_assets( for resource_type, resource_ids in active.items(): inactive_ids = set(resource_ids) - set(assets.get(resource_type, [])) for id in inactive_ids: - session.delete(session.query(orm.ProjectAsset).get(id)) + session.delete(session.query(ProjectAsset).get(id)) From 4e5373905549532fc9af513469db4d618c2a9ad1 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 11:37:29 -0700 Subject: [PATCH 038/140] Fixed concept schema file. --- tds/schema/concept.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tds/schema/concept.py b/tds/schema/concept.py index d692c098a..44cdd239e 100644 --- a/tds/schema/concept.py +++ b/tds/schema/concept.py @@ -4,12 +4,12 @@ # pylint: disable=missing-class-docstring, too-few-public-methods from pydantic import BaseModel -from tds.autogen import schema +from tds.modules.concept.model import OntologicalField class Concept(BaseModel): curie: str - status: schema.OntologicalField + status: OntologicalField class Config: orm_mode = True From 06c117c235bf244b18fd16fe3d013672d30c1b29 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 11:43:10 -0700 Subject: [PATCH 039/140] Updated dataset lib, removed final schema/orm items. --- tds/lib/datasets.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/tds/lib/datasets.py b/tds/lib/datasets.py index 7d11e5c11..d452f444d 100644 --- a/tds/lib/datasets.py +++ b/tds/lib/datasets.py @@ -1,5 +1,5 @@ """ -Qualifer specific logic +Qualifier specific logic """ import json @@ -8,8 +8,11 @@ from sqlalchemy.engine.base import Engine from sqlalchemy.orm import Session -from tds.autogen import schema -from tds.modules.dataset.model import QualifierXref +from tds.modules.dataset.model import ( + QualifierPayload, + QualifierXref, + QualifierXrefPayload, +) logger = Logger(__file__) @@ -26,16 +29,16 @@ def get_qualifier_xrefs(count: int, rdb: Engine): return result -def get_qualifier_xref(id: int, rdb: Engine) -> str: +def get_qualifier_xref(xref_id: int, rdb: Engine) -> str: """ Get a specific qualifier xref by ID """ with Session(rdb) as session: - result = session.query(QualifierXref).get(id) + result = session.query(QualifierXref).get(xref_id) return result -def create_qualifier_xref(payload: schema.QualifierXref, rdb: Engine): +def create_qualifier_xref(payload: QualifierXrefPayload, rdb: Engine): """ Create a qualifier xref """ @@ -62,25 +65,27 @@ def create_qualifier_xref(payload: schema.QualifierXref, rdb: Engine): return json.dumps(qualifier_xrefp) -def update_qualifier_xref(payload: schema.Qualifier, id: int, rdb: Engine) -> str: +def update_qualifier_xref(payload: QualifierPayload, xref_id: int, rdb: Engine) -> str: """ Update a qualifier xref by ID """ with Session(rdb) as session: data_payload = payload.dict(exclude_unset=True) - data_payload["id"] = id + data_payload["id"] = xref_id logger.info(data_payload) - data_to_update = session.query(QualifierXref).filter(QualifierXref.id == id) + data_to_update = session.query(QualifierXref).filter( + QualifierXref.id == xref_id + ) data_to_update.update(data_payload) session.commit() return "Updated Qualifier xref" -def delete_qualifier_xref(id: int, rdb: Engine) -> str: +def delete_qualifier_xref(xref_id: int, rdb: Engine) -> str: """ Delete a qualifier xref by ID """ with Session(rdb) as session: - session.query(QualifierXref).filter(QualifierXref.id == id).delete() + session.query(QualifierXref).filter(QualifierXref.id == xref_id).delete() session.commit() From 240aeb67b30bc07b4ff84f206fe6a699652d2564 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 11:43:27 -0700 Subject: [PATCH 040/140] Removing Qualifier from schema. --- tds/autogen/schema.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tds/autogen/schema.py b/tds/autogen/schema.py index 0840bf4b9..d20727b80 100644 --- a/tds/autogen/schema.py +++ b/tds/autogen/schema.py @@ -18,11 +18,3 @@ class Feature(BaseModel): display_name: Optional[str] name: str value_type: ValueType - - -class Qualifier(BaseModel): - id: Optional[int] = None - dataset_id: Optional[int] = None - description: Optional[str] - name: str - value_type: ValueType From eaf446b44ffb05cc72586487a162af050fb24fac Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 11:44:25 -0700 Subject: [PATCH 041/140] Added payloads to dataset model. --- tds/modules/dataset/model.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tds/modules/dataset/model.py b/tds/modules/dataset/model.py index d36aa81bb..b40d15511 100644 --- a/tds/modules/dataset/model.py +++ b/tds/modules/dataset/model.py @@ -184,6 +184,16 @@ class QualifierXref(Base): feature_id = sa.Column(sa.Integer(), sa.ForeignKey("feature.id"), nullable=False) +class QualifierXrefPayload(BaseModel): + """ + QualifierXref Payload Model. + """ + + id: Optional[int] = None + qualifier_id: Optional[int] = None + feature_id: Optional[int] = None + + class Qualifier(Base): """ Qualifier Data Model. @@ -198,6 +208,18 @@ class Qualifier(Base): value_type = sa.Column(sa.Enum(ValueType), nullable=False) +class QualifierPayload(BaseModel): + """ + Qualifier Payload Model. + """ + + id: Optional[int] = None + dataset_id: Optional[int] = None + description: Optional[str] + name: str + value_type: ValueType + + class Feature(Base): """ Feature Data Model. From d7f3e51eac9cc4bd631cc121ac215a07e06e8ef6 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 11:45:58 -0700 Subject: [PATCH 042/140] Code clean up. --- tds/modules/dataset/model.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/tds/modules/dataset/model.py b/tds/modules/dataset/model.py index b40d15511..e9c9a4d13 100644 --- a/tds/modules/dataset/model.py +++ b/tds/modules/dataset/model.py @@ -158,17 +158,6 @@ class Config: } } - # def _extract_concepts(self): - # """ - # Method extracts concepts from the dataset and saves them to the db. - # """ - # curies = [] - # with Session(pg_engine) as pg_db: - # pass - - # def _establish_provenance(self): - # pass - class QualifierXref(Base): """ From 0ed9742db95db47429bf4e7281a1bee526044431 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 11:50:48 -0700 Subject: [PATCH 043/140] Cleaned up schema package's resource file. --- tds/schema/resource.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tds/schema/resource.py b/tds/schema/resource.py index c20742fe5..54e1924d5 100644 --- a/tds/schema/resource.py +++ b/tds/schema/resource.py @@ -6,29 +6,30 @@ from collections import defaultdict from typing import Dict, Optional, Type -from tds.autogen import orm, schema from tds.db.enums import ResourceType from tds.modules.artifact.model import Artifact from tds.modules.dataset.model import Dataset +from tds.modules.external.model import Publication as PublicationModel +from tds.modules.external.model import PublicationPayload, SoftwarePayload from tds.modules.model.model import Model from tds.modules.model_configuration.model import ModelConfiguration from tds.modules.simulation.model import Simulation from tds.modules.workflow.model import Workflow -class Publication(schema.Publication): +class Publication(PublicationPayload): class Config: orm_mode = True -class Software(schema.Software): +class Software(SoftwarePayload): class Config: orm_mode = True Resource = Dataset | Model | ModelConfiguration | Publication | Simulation | Workflow -ORMResource = Dataset | orm.Publication | Simulation +ORMResource = Dataset | PublicationModel | Simulation obj_to_enum: Dict[Type[Resource], ResourceType] = { Dataset: ResourceType.datasets, @@ -82,7 +83,7 @@ def get_resource_orm(resource_type: ResourceType) -> Optional[ORMResource]: lambda: None, { ResourceType.datasets: Dataset, - ResourceType.publications: orm.Publication, + ResourceType.publications: PublicationModel, ResourceType.simulations: Simulation, }, ) From 390ea0f90b000bdb8d3ea2bd4b447f398921d6f1 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 11:54:17 -0700 Subject: [PATCH 044/140] Cleaned up schema package's project file. --- tds/schema/project.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tds/schema/project.py b/tds/schema/project.py index d6f5f1dff..fc56ba71c 100644 --- a/tds/schema/project.py +++ b/tds/schema/project.py @@ -4,23 +4,25 @@ # pylint: disable=missing-class-docstring from typing import Dict, List, Optional, Set -from tds.autogen import orm, schema +from tds.db.enums import ResourceType +from tds.modules.project.model import Project as ProjectModel +from tds.modules.project.model import ProjectAsset, ProjectPayload from tds.schema.concept import Concept -class Project(schema.Project): +class Project(ProjectPayload): concept: Optional[Concept] = None active = True - assets: Dict[schema.ResourceType, Set[int | str]] = {} + assets: Dict[ResourceType, Set[int | str]] = {} @classmethod def from_orm( - cls, body: orm.Project, project_assets: List[orm.ProjectAsset] + cls, body: ProjectModel, project_assets: List[ProjectAsset] ) -> "Project": """ Handle the creation of asset dict """ - assets = {type: [] for type in schema.ResourceType} + assets = {type: [] for type in ResourceType} for asset in project_assets: assets[asset.resource_type].append(asset.resource_id) @@ -39,7 +41,7 @@ class Config: } -class ProjectMetadata(schema.Project): +class ProjectMetadata(ProjectPayload): concept: Optional[Concept] = None class Config: From abe10adf8e6b17aa978f0bbc064c37974ff5be42 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 11:55:35 -0700 Subject: [PATCH 045/140] Cleaned up model utils. --- tds/modules/model/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tds/modules/model/utils.py b/tds/modules/model/utils.py index 8e8233449..e30333468 100644 --- a/tds/modules/model/utils.py +++ b/tds/modules/model/utils.py @@ -10,8 +10,8 @@ from fastapi.encoders import jsonable_encoder from sqlalchemy.orm import Session -from tds.autogen import orm from tds.db.relational import engine as pg_engine +from tds.modules.model.model import ModelFramework from tds.modules.model.model_description import ModelDescription model_list_fields = [ @@ -100,7 +100,7 @@ def get_frameworks() -> dict: Get model frameworks from postgres. """ with Session(pg_engine) as pg_db: - frameworks = pg_db.query(orm.ModelFramework).all() + frameworks = pg_db.query(ModelFramework).all() framework_map = {} for framework in frameworks: framework_map[framework.schema_url] = framework.name From 4e3c0bfc76b828eaef49c3dc612d5dfcded0273a Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 11:59:36 -0700 Subject: [PATCH 046/140] Converted schema Feature class to modular structure. --- tds/autogen/schema.py | 9 --------- tds/modules/dataset/model.py | 13 +++++++++++++ tds/schema/dataset.py | 6 +++--- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/tds/autogen/schema.py b/tds/autogen/schema.py index d20727b80..14c99c2fb 100644 --- a/tds/autogen/schema.py +++ b/tds/autogen/schema.py @@ -9,12 +9,3 @@ from pydantic import BaseModel from tds.db.enums import ValueType - - -class Feature(BaseModel): - id: Optional[int] = None - dataset_id: Optional[int] = None - description: Optional[str] - display_name: Optional[str] - name: str - value_type: ValueType diff --git a/tds/modules/dataset/model.py b/tds/modules/dataset/model.py index e9c9a4d13..d483926df 100644 --- a/tds/modules/dataset/model.py +++ b/tds/modules/dataset/model.py @@ -222,3 +222,16 @@ class Feature(Base): display_name = sa.Column(sa.String()) name = sa.Column(sa.String(), nullable=False) value_type = sa.Column(sa.Enum(ValueType), nullable=False) + + +class FeaturePayload(BaseModel): + """ + Feature Payload Model. + """ + + id: Optional[int] = None + dataset_id: Optional[int] = None + description: Optional[str] + display_name: Optional[str] + name: str + value_type: ValueType diff --git a/tds/schema/dataset.py b/tds/schema/dataset.py index 5f1c404dd..344f4b9e7 100644 --- a/tds/schema/dataset.py +++ b/tds/schema/dataset.py @@ -4,11 +4,11 @@ # pylint: disable=missing-class-docstring, too-few-public-methods from typing import List, Optional -from tds.autogen import schema +from tds.modules.dataset.model import FeaturePayload, QualifierPayload from tds.schema.concept import Concept -class Qualifier(schema.Qualifier): +class Qualifier(QualifierPayload): feature_names: List[str] concept: Optional[Concept] @@ -16,7 +16,7 @@ class Config: orm_mode = True -class Feature(schema.Feature): +class Feature(FeaturePayload): concept: Optional[Concept] class Config: From c10053d570ec8714ffb720ef96747d5bafb793a2 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 12:00:34 -0700 Subject: [PATCH 047/140] Converted model to use modular structure. --- tds/schema/model.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tds/schema/model.py b/tds/schema/model.py index eb5948087..b5308f638 100644 --- a/tds/schema/model.py +++ b/tds/schema/model.py @@ -7,7 +7,7 @@ from fastapi.encoders import jsonable_encoder from pydantic import BaseModel -from tds.autogen import schema +from tds.modules.model.model import ModelFrameworkPayload ModelParameters = List[Dict] @@ -59,6 +59,6 @@ class Config: } -class ModelFramework(schema.ModelFramework): +class ModelFramework(ModelFrameworkPayload): class Config: orm_mode = True From 1bfc4c440e7c3337d45115d8033b48f413bf904b Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 12:03:21 -0700 Subject: [PATCH 048/140] Fixed Publication location in external router. --- tds/routers/external.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tds/routers/external.py b/tds/routers/external.py index 2604bdf87..2b7ac689e 100644 --- a/tds/routers/external.py +++ b/tds/routers/external.py @@ -10,8 +10,8 @@ from sqlalchemy.engine.base import Engine from sqlalchemy.orm import Session -from tds.autogen import orm from tds.db import request_rdb +from tds.modules.external.model import Publication, Software from tds.operation import create, delete, retrieve from tds.schema.resource import Publication, Software @@ -25,8 +25,8 @@ def get_software(id: int, rdb: Engine = Depends(request_rdb)) -> Software: Retrieve software metadata """ with Session(rdb) as session: - if session.query(orm.Software).filter(orm.Software.id == id).count() == 1: - return Software.from_orm(session.query(orm.Software).get(id)) + if session.query(Software).filter(Software.id == id).count() == 1: + return Software.from_orm(session.query(Software).get(id)) raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) @@ -37,7 +37,7 @@ def create_software(payload: Software, rdb: Engine = Depends(request_rdb)) -> Re """ with Session(rdb) as session: software_payload = payload.dict() - software = orm.Software(**software_payload) + software = Software(**software_payload) session.add(software) session.commit() id: int = software.id @@ -57,8 +57,8 @@ def delete_software(id: int, rdb: Engine = Depends(request_rdb)) -> Response: Delete software metadata """ with Session(rdb) as session: - if session.query(orm.Software).filter(orm.Software.id == id).count() == 1: - software = session.query(orm.Software).get(id) + if session.query(Software).filter(Software.id == id).count() == 1: + software = session.query(Software).get(id) session.delete(software) session.commit() else: @@ -75,11 +75,11 @@ def get_publication(id: int | str, rdb: Engine = Depends(request_rdb)) -> Public """ with Session(rdb) as session: publications = ( - session.query(orm.Publication) + session.query(Publication) .filter( or_( - str(id) == orm.Publication.xdd_uri, - (str(id).isdigit()) and (int(id) == orm.Publication.id), + str(id) == Publication.xdd_uri, + (str(id).isdigit()) and (int(id) == Publication.id), ) ) .all() @@ -101,9 +101,9 @@ def create_publication( with Session(rdb) as session: publication_payload = payload.dict() publications = ( - session.query(orm.Publication) + session.query(Publication) .filter( - str(publication_payload["xdd_uri"]) == orm.Publication.xdd_uri, + str(publication_payload["xdd_uri"]) == Publication.xdd_uri, ) .all() ) @@ -119,7 +119,7 @@ def create_publication( content=json.dumps(publication), ) # pylint: disable-next=unused-variable - publication = orm.Publication(**publication_payload) + publication = Publication(**publication_payload) session.add(publication) session.commit() id: int = publication.id @@ -140,8 +140,8 @@ def delete_publication(id: int, rdb: Engine = Depends(request_rdb)) -> Response: Delete publications metadata """ with Session(rdb) as session: - if session.query(orm.Publication).filter(orm.Publication.id == id).count() == 1: - publication = session.query(orm.Publication).get(id) + if session.query(Publication).filter(Publication.id == id).count() == 1: + publication = session.query(Publication).get(id) session.delete(publication) session.commit() else: From d017aadfb5b06780d206d0d8c355afe7c92209d0 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 12 Jul 2023 12:04:00 -0700 Subject: [PATCH 049/140] Removing autogen module. --- tds/autogen/README.md | 4 ---- tds/autogen/__init__.py | 0 tds/autogen/orm.py | 12 ------------ tds/autogen/schema.py | 11 ----------- 4 files changed, 27 deletions(-) delete mode 100644 tds/autogen/README.md delete mode 100644 tds/autogen/__init__.py delete mode 100644 tds/autogen/orm.py delete mode 100644 tds/autogen/schema.py diff --git a/tds/autogen/README.md b/tds/autogen/README.md deleted file mode 100644 index a115ec3e6..000000000 --- a/tds/autogen/README.md +++ /dev/null @@ -1,4 +0,0 @@ - -~~THIS DIRECTORY IS AUTOGENERATED. DO NOT EDIT MANUALLY~~ - -As of 5/26/23 this directory is no longer automatically generated. \ No newline at end of file diff --git a/tds/autogen/__init__.py b/tds/autogen/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tds/autogen/orm.py b/tds/autogen/orm.py deleted file mode 100644 index 7353a0517..000000000 --- a/tds/autogen/orm.py +++ /dev/null @@ -1,12 +0,0 @@ -# pylint: skip-file -""" -ORM file from DBML autogen. -Skipping linter to prevent class docstring errors. -@TODO: Clean up file to pass linting. -""" -import sqlalchemy as sa -from sqlalchemy.ext.declarative import declarative_base - -from tds.db.enums import ValueType - -Base = declarative_base() diff --git a/tds/autogen/schema.py b/tds/autogen/schema.py deleted file mode 100644 index 14c99c2fb..000000000 --- a/tds/autogen/schema.py +++ /dev/null @@ -1,11 +0,0 @@ -# pylint: skip-file -""" -Schema file from DBML autogen. -Skipping linter to prevent class docstring errors. -@TODO: Clean up file to pass linting. -""" -from typing import Optional - -from pydantic import BaseModel - -from tds.db.enums import ValueType From 8e5e4cb40b6f4ac8b9f31971eac8012fb4c190ba Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 07:54:25 -0700 Subject: [PATCH 050/140] Removing external router. --- tds/routers/external.py | 151 ---------------------------------------- 1 file changed, 151 deletions(-) delete mode 100644 tds/routers/external.py diff --git a/tds/routers/external.py b/tds/routers/external.py deleted file mode 100644 index 2b7ac689e..000000000 --- a/tds/routers/external.py +++ /dev/null @@ -1,151 +0,0 @@ -""" -Basic crud operations for external resources -""" - -import json -from logging import Logger - -from fastapi import APIRouter, Depends, HTTPException, Response, status -from sqlalchemy import or_ -from sqlalchemy.engine.base import Engine -from sqlalchemy.orm import Session - -from tds.db import request_rdb -from tds.modules.external.model import Publication, Software -from tds.operation import create, delete, retrieve -from tds.schema.resource import Publication, Software - -logger = Logger(__name__) -router = APIRouter() - - -@router.get("/software/{id}", **retrieve.fastapi_endpoint_config) -def get_software(id: int, rdb: Engine = Depends(request_rdb)) -> Software: - """ - Retrieve software metadata - """ - with Session(rdb) as session: - if session.query(Software).filter(Software.id == id).count() == 1: - return Software.from_orm(session.query(Software).get(id)) - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) - - -@router.post("/software", **create.fastapi_endpoint_config) -def create_software(payload: Software, rdb: Engine = Depends(request_rdb)) -> Response: - """ - Create software metadata - """ - with Session(rdb) as session: - software_payload = payload.dict() - software = Software(**software_payload) - session.add(software) - session.commit() - id: int = software.id - logger.info("new software with %i", id) - return Response( - status_code=status.HTTP_201_CREATED, - headers={ - "content-type": "application/json", - }, - content=json.dumps({"id": id}), - ) - - -@router.delete("/software/{id}", **delete.fastapi_endpoint_config) -def delete_software(id: int, rdb: Engine = Depends(request_rdb)) -> Response: - """ - Delete software metadata - """ - with Session(rdb) as session: - if session.query(Software).filter(Software.id == id).count() == 1: - software = session.query(Software).get(id) - session.delete(software) - session.commit() - else: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) - return Response( - status_code=status.HTTP_204_NO_CONTENT, - ) - - -@router.get("/publications/{id}", **retrieve.fastapi_endpoint_config) -def get_publication(id: int | str, rdb: Engine = Depends(request_rdb)) -> Publication: - """ - Retrieve model - """ - with Session(rdb) as session: - publications = ( - session.query(Publication) - .filter( - or_( - str(id) == Publication.xdd_uri, - (str(id).isdigit()) and (int(id) == Publication.id), - ) - ) - .all() - ) - if len(publications) != 0: - publication = publications[0] - else: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) - return Publication.from_orm(publication) - - -@router.post("/publications", **create.fastapi_endpoint_config) -def create_publication( - payload: Publication, rdb: Engine = Depends(request_rdb) -) -> Response: - """ - Create publication and return its ID - """ - with Session(rdb) as session: - publication_payload = payload.dict() - publications = ( - session.query(Publication) - .filter( - str(publication_payload["xdd_uri"]) == Publication.xdd_uri, - ) - .all() - ) - - if len(publications) != 0: - publication = publications[0].__dict__.copy() - publication.pop("_sa_instance_state") - return Response( - status_code=status.HTTP_200_OK, - headers={ - "content-type": "application/json", - }, - content=json.dumps(publication), - ) - # pylint: disable-next=unused-variable - publication = Publication(**publication_payload) - session.add(publication) - session.commit() - id: int = publication.id - - logger.info("new publication created: %i", id) - return Response( - status_code=status.HTTP_201_CREATED, - headers={ - "content-type": "application/json", - }, - content=json.dumps({"id": id}), - ) - - -@router.delete("/publications/{id}", **delete.fastapi_endpoint_config) -def delete_publication(id: int, rdb: Engine = Depends(request_rdb)) -> Response: - """ - Delete publications metadata - """ - with Session(rdb) as session: - if session.query(Publication).filter(Publication.id == id).count() == 1: - publication = session.query(Publication).get(id) - session.delete(publication) - session.commit() - else: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) - return Response( - status_code=status.HTTP_204_NO_CONTENT, - ) From 033e3d63e123bfe32de5045943d60f347b171af4 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 07:54:58 -0700 Subject: [PATCH 051/140] Fixed ES error in project controller. --- tds/modules/project/controller.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tds/modules/project/controller.py b/tds/modules/project/controller.py index 1fd56998a..1164ccb19 100644 --- a/tds/modules/project/controller.py +++ b/tds/modules/project/controller.py @@ -4,7 +4,6 @@ from logging import Logger from typing import List, Optional -from elasticsearch import NotFoundError from fastapi import APIRouter, Depends, HTTPException from fastapi import Query as FastAPIQuery from fastapi import status @@ -12,6 +11,7 @@ from fastapi.responses import JSONResponse from sqlalchemy.engine.base import Engine from sqlalchemy.orm import Query, Session +from sqlalchemy.orm.exc import NoResultFound from tds.db import entry_exists, es_client, request_rdb from tds.db.enums import ResourceType @@ -110,7 +110,7 @@ def project_get(project_id: int, rdb: Engine = Depends(request_rdb)) -> JSONResp headers={"content-type": "application/json"}, content=jsonable_encoder(project), ) - except NotFoundError: + except NoResultFound: return JSONResponse( status_code=status.HTTP_404_NOT_FOUND, headers={"content-type": "application/json"}, @@ -183,7 +183,7 @@ def project_delete(project_id: int, rdb: Engine = Depends(request_rdb)) -> JSONR headers={"content-type": "application/json"}, content={"id": project_id, "status": project_["active"]}, ) - except NotFoundError: + except NoResultFound: return JSONResponse( status_code=status.HTTP_404_NOT_FOUND, headers={"content-type": "application/json"}, From cfc24a161f794f85cb1b9cab5ceaaaaddd1e1a73 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 07:55:18 -0700 Subject: [PATCH 052/140] Fixed duplicate relationship on Person model. --- tds/modules/person/model.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tds/modules/person/model.py b/tds/modules/person/model.py index f7e71de0d..9e86d1b2e 100644 --- a/tds/modules/person/model.py +++ b/tds/modules/person/model.py @@ -70,8 +70,6 @@ class Association(Base): resource_type = sa.Column(sa.Enum(ResourceType)) role = sa.Column(sa.Enum(Role)) - person = relationship("Person", cascade=False, single_parent=True) - class AssociationPayload(BaseModel): """ From 21abccad9e67df963df01ca373d87462fdcf9a9d Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 07:55:35 -0700 Subject: [PATCH 053/140] Adding external module. --- tds/modules/external/__init__.py | 10 + tds/modules/external/controller.py | 333 +++++++++++++++++++++++++++++ tds/modules/external/model.py | 59 +++++ 3 files changed, 402 insertions(+) create mode 100644 tds/modules/external/__init__.py create mode 100644 tds/modules/external/controller.py create mode 100644 tds/modules/external/model.py diff --git a/tds/modules/external/__init__.py b/tds/modules/external/__init__.py new file mode 100644 index 000000000..45e9a75a2 --- /dev/null +++ b/tds/modules/external/__init__.py @@ -0,0 +1,10 @@ +""" + TDS External Module. + + A simple REST module that creates the basic endpoints for an entity in + Terarium Data Service (TDS). +""" +from tds.modules.external.controller import external_router as router + +ROUTE_PREFIX = "external" +TAGS = ["External"] diff --git a/tds/modules/external/controller.py b/tds/modules/external/controller.py new file mode 100644 index 000000000..dea8970fb --- /dev/null +++ b/tds/modules/external/controller.py @@ -0,0 +1,333 @@ +""" + TDS External Controller. + + Description: Defines the basic rest endpoints for the TDS Module. +""" +from logging import Logger + +from fastapi import APIRouter, Depends, status +from fastapi.encoders import jsonable_encoder +from fastapi.responses import JSONResponse +from sqlalchemy.engine.base import Engine +from sqlalchemy.orm import Session +from sqlalchemy.orm.exc import NoResultFound + +from tds.db import entry_exists, request_rdb +from tds.modules.external.model import ( + Publication, + PublicationPayload, + Software, + SoftwarePayload, +) +from tds.operation import create, delete, retrieve, update + +external_router = APIRouter() +logger = Logger(__name__) + + +@external_router.get( + "/software", + response_model=list[SoftwarePayload], + **retrieve.fastapi_endpoint_config, +) +def list_software( + page_size: int = 100, page: int = 0, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Retrieve list of software from db. + """ + with Session(rdb) as session: + software = session.query(Software).all() + + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content=jsonable_encoder(software), + ) + + +@external_router.post("/software", **create.fastapi_endpoint_config) +def software_post( + payload: SoftwarePayload, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Create software and return its ID + """ + software_payload = payload.dict() + + with Session(rdb) as session: + software = Software(**software_payload) + session.add(software) + session.commit() + + return JSONResponse( + status_code=status.HTTP_201_CREATED, + headers={ + "content-type": "application/json", + }, + content={"id": software.id}, + ) + + +@external_router.get( + "/software/{software_id}", + response_model=SoftwarePayload, + **retrieve.fastapi_endpoint_config, +) +def software_get(software_id: int, rdb: Engine = Depends(request_rdb)) -> JSONResponse: + """ + Retrieve software record from DB. + """ + try: + with Session(rdb) as session: + software = session.query(Software).filter(Software.id == software_id).all() + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content=jsonable_encoder(software), + ) + except NoResultFound: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={ + "content-type": "application/json", + }, + content={"message": f"Software with id {software_id} does not exist."}, + ) + + +@external_router.put("/software/{software_id}", **update.fastapi_endpoint_config) +def software_put( + software_id: int, payload: SoftwarePayload, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Update software record in DB + """ + try: + if entry_exists(rdb.connect(), Software, software_id): + software_payload = payload.dict() + software_payload.pop("id") + with Session(rdb) as session: + session.query(Software).filter(Software.id == software_id).update( + software_payload + ) + session.commit() + + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content={"id": software_id}, + ) + except NoResultFound: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={ + "content-type": "application/json", + }, + content={ + "message": f"Software with id of {software_id} does not exist.", + }, + ) + + +@external_router.delete("/software/{software_id}", **delete.fastapi_endpoint_config) +def software_delete( + software_id: int, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Delete software record in DB + """ + try: + if entry_exists(rdb.connect(), Software, software_id): + with Session(rdb) as session: + session.query(Software).filter(Software.id == software_id).delete() + session.commit() + + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content={"message": f"Software with id {software_id} deleted."}, + ) + raise NoResultFound + except NoResultFound: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={ + "content-type": "application/json", + }, + content={"message": f"Software with id {software_id} does not exist."}, + ) + + +@external_router.get( + "/publications", + response_model=PublicationPayload, + **retrieve.fastapi_endpoint_config, +) +def publication_list( + page_size: int = 100, page: int = 0, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Retrieve a publication record from DB. + """ + with Session(rdb) as session: + publications = session.query(Publication).all() + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content=jsonable_encoder(publications), + ) + + +@external_router.post("/publications", **create.fastapi_endpoint_config) +def publication_post( + payload: PublicationPayload, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Create a publication and return its ID + """ + publication_payload = payload.dict() + xdd_uri = str(publication_payload["xdd_uri"]) + with Session(rdb) as session: + publications = ( + session.query(Publication).filter(Publication.xdd_uri == xdd_uri).all() + ) + + if len(publications) < 1: + publication = Publication(**publication_payload) + session.add(publication) + session.commit() + + return JSONResponse( + status_code=status.HTTP_201_CREATED, + headers={ + "content-type": "application/json", + }, + content={"id": publication.id}, + ) + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content={ + "message": f"Publication with xdd_uri of {xdd_uri} exists", + "id": publications[0].id, + }, + ) + + +@external_router.get( + "/publications/{publication_id}", + response_model=PublicationPayload, + **retrieve.fastapi_endpoint_config, +) +def publication_get( + publication_id: int, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Retrieve a publication record from DB. + """ + try: + with Session(rdb) as session: + publication = session.query(Publication).get(publication_id) + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content=jsonable_encoder(publication), + ) + except NoResultFound: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={ + "content-type": "application/json", + }, + content={ + "message": f"Publication with id {publication_id} does not exist." + }, + ) + + +@external_router.put("/publications/{publication_id}", **create.fastapi_endpoint_config) +def publication_put( + publication_id: int, payload: PublicationPayload, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Update a publication and return its ID + """ + try: + if entry_exists(rdb.connect(), Publication, publication_id): + publication_payload = payload.dict() + publication_payload.pop("id") + with Session(rdb) as session: + session.query(Publication).filter( + Publication.id == publication_id + ).update(publication_payload) + session.commit() + + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content={"id": publication_id}, + ) + except NoResultFound: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={ + "content-type": "application/json", + }, + content={ + "message": f"Publication with id of {publication_id} does not exist.", + }, + ) + + +@external_router.delete( + "/publications/{publication_id}", **delete.fastapi_endpoint_config +) +def publication_delete( + publication_id: int, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Delete publication record in DB + """ + try: + if entry_exists(rdb.connect(), Publication, publication_id): + with Session(rdb) as session: + session.query(Publication).filter( + Publication.id == publication_id + ).delete() + session.commit() + + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content={"message": f"Publication with id {publication_id} deleted."}, + ) + raise NoResultFound + except NoResultFound: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={ + "content-type": "application/json", + }, + content={ + "message": f"Publication with id {publication_id} does not exist." + }, + ) diff --git a/tds/modules/external/model.py b/tds/modules/external/model.py new file mode 100644 index 000000000..c74d57ad3 --- /dev/null +++ b/tds/modules/external/model.py @@ -0,0 +1,59 @@ +""" +TDS External Data Model Definition. +""" +from datetime import datetime +from typing import Optional + +import sqlalchemy as sa +from pydantic import BaseModel +from sqlalchemy import func + +from tds.db.base import Base + + +class Publication(Base): + """ + External Publication Data Model. + """ + + __tablename__ = "publication" + + id = sa.Column(sa.Integer(), primary_key=True) + xdd_uri = sa.Column(sa.String(), nullable=False) + title = sa.Column(sa.String(), nullable=False) + publication_data = sa.Column(sa.JSON, nullable=True) + + +class PublicationPayload(BaseModel): + """ + External PublicationPayload Model. + """ + + id: Optional[int] = None + xdd_uri: str + title: str + publication_data: Optional[dict] + + +class Software(Base): + """ + External Software Data Model. + """ + + __tablename__ = "software" + + id = sa.Column(sa.Integer(), primary_key=True) + timestamp = sa.Column(sa.DateTime(), nullable=False, server_default=func.now()) + source = sa.Column(sa.String(), nullable=False) + storage_uri = sa.Column(sa.String(), nullable=False) + + +class SoftwarePayload(BaseModel): + """ + External SoftwarePayload Model. + """ + + id: Optional[int] = None + timestamp: datetime = datetime.now() + source: str + storage_uri: str From d377e3eed9487e10e89e42fae025105c6d5218c2 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 08:02:02 -0700 Subject: [PATCH 054/140] Moving disabled operations method to model controller for retention. --- tds/modules/model/controller.py | 131 ++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/tds/modules/model/controller.py b/tds/modules/model/controller.py index 28a0426a3..49fe459a0 100644 --- a/tds/modules/model/controller.py +++ b/tds/modules/model/controller.py @@ -295,3 +295,134 @@ def model_delete(model_id: str) -> Response: "content-type": "application/json", }, ) + + +# @TODO: Refactor this code to work with new AMR model representation in ES. +# @router.post("/opts/{model_operation}", **create.fastapi_endpoint_config) +# def model_opt( +# payload: ModelOptPayload, +# model_operation: enums.ModelOperations, +# rdb: Engine = Depends(request_rdb), +# graph_db=Depends(request_graph_db), +# ) -> Response: +# """ +# Make modeling operations. +# """ +# with Session(rdb) as session: +# payload = payload.dict() +# l_model = session.query(orm.ModelDescription).get(payload.get("left")) +# if payload.get("right", False): +# r_model = session.query(orm.ModelDescription).get(payload.get("right")) +# +# if model_operation == "copy": +# state = orm.ModelState( +# content=session.query(orm.ModelState) +# .get(payload.get("left")) +# .__dict__.get("content") +# ) +# +# elif model_operation in ("decompose", "glue"): +# state = orm.ModelState(content=payload.get("content")) +# else: +# raise HTTPException(status_code=400, detail="Operation not supported") +# +# session.add(state) +# session.commit() +# +# # add new model +# new_model = orm.ModelDescription( +# name=payload.get("name"), +# description=payload.get("description"), +# framework=payload.get("framework"), +# state_id=state.id, +# ) +# session.add(new_model) +# session.commit() +# +# # add parameters to new model. Default to left model id parameters. +# if payload.get("parameters") is None: +# parameters: List[dict] = ( +# session.query(orm.ModelParameter) +# .filter(orm.ModelParameter.model_id == payload.get("left")) +# .all() +# ) +# payload["parameters"] = [] +# for parameter in parameters: +# payload["parameters"].append(parameter.__dict__) +# +# for param in payload.get("parameters"): +# session.add( +# orm.ModelParameter( +# model_id=new_model.id, +# name=param.get("name"), +# default_value=param.get("default_value"), +# type=param.get("type"), +# state_variable=param.get("state_variable"), +# ) +# ) +# session.commit() +# +# if settings.NEO4J_ENABLED: +# provenance_handler = ProvenanceHandler(rdb=rdb, graph_db=graph_db) +# prov_payload = Provenance( +# left=state.id, +# left_type="ModelRevision", +# right=l_model.state_id, +# right_type="ModelRevision", +# relation_type=model_opt_relationship_mapping[model_operation], +# user_id=payload.get("user_id", None), +# concept=".", +# ) +# provenance_handler.create_entry(prov_payload) +# +# if model_operation == "glue" and payload.get("right", False): +# prov_payload = Provenance( +# left=state.id, +# left_type="ModelRevision", +# right=r_model.state_id, +# right_type="ModelRevision", +# relation_type=model_opt_relationship_mapping[model_operation], +# user_id=payload.get("user_id", None), +# concept=".", +# ) +# provenance_handler.create_entry(prov_payload) +# +# # add begins at relationship +# prov_payload = Provenance( +# left=new_model.id, +# left_type="Model", +# right=state.id, +# right_type="ModelRevision", +# relation_type="BEGINS_AT", +# user_id=payload.get("user_id", None), +# concept=".", +# ) +# provenance_handler.create_entry(prov_payload) +# +# # get recently added parameters for the new model +# parameters: Query[orm.ModelParameter] = session.query( +# orm.ModelParameter +# ).filter(orm.ModelParameter.model_id == new_model.id) +# +# created_parameters = orm_to_params(list(parameters)) +# # add ModelParameter nodes +# for parameter in created_parameters: +# payload = Provenance( +# left=parameter.get("id"), +# left_type="ModelParameter", +# right=new_model.state_id, +# right_type="ModelRevision", +# relation_type="PARAMETER_OF", +# user_id=None, +# concept=".", +# ) +# provenance_handler.create_entry(payload) +# +# logger.info("new model created: %i", id) +# return Response( +# status_code=status.HTTP_201_CREATED, +# headers={ +# "content-type": "application/json", +# }, +# content=json.dumps({"id": new_model.id}), +# ) From c9cf857e01b32dcaa7d7cd61cbd9fe55ba1dcebe Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 08:02:17 -0700 Subject: [PATCH 055/140] Removed op code from old router. --- tds/routers/models.py | 131 ------------------------------------------ 1 file changed, 131 deletions(-) diff --git a/tds/routers/models.py b/tds/routers/models.py index f69319499..32650c013 100644 --- a/tds/routers/models.py +++ b/tds/routers/models.py @@ -73,134 +73,3 @@ def delete_framework(name: str, rdb: Engine = Depends(request_rdb)) -> Response: return Response( status_code=status.HTTP_204_NO_CONTENT, ) - - -# @TODO: Refactor this code to work with new AMR model representation in ES. -# @router.post("/opts/{model_operation}", **create.fastapi_endpoint_config) -# def model_opt( -# payload: ModelOptPayload, -# model_operation: enums.ModelOperations, -# rdb: Engine = Depends(request_rdb), -# graph_db=Depends(request_graph_db), -# ) -> Response: -# """ -# Make modeling operations. -# """ -# with Session(rdb) as session: -# payload = payload.dict() -# l_model = session.query(orm.ModelDescription).get(payload.get("left")) -# if payload.get("right", False): -# r_model = session.query(orm.ModelDescription).get(payload.get("right")) -# -# if model_operation == "copy": -# state = orm.ModelState( -# content=session.query(orm.ModelState) -# .get(payload.get("left")) -# .__dict__.get("content") -# ) -# -# elif model_operation in ("decompose", "glue"): -# state = orm.ModelState(content=payload.get("content")) -# else: -# raise HTTPException(status_code=400, detail="Operation not supported") -# -# session.add(state) -# session.commit() -# -# # add new model -# new_model = orm.ModelDescription( -# name=payload.get("name"), -# description=payload.get("description"), -# framework=payload.get("framework"), -# state_id=state.id, -# ) -# session.add(new_model) -# session.commit() -# -# # add parameters to new model. Default to left model id parameters. -# if payload.get("parameters") is None: -# parameters: List[dict] = ( -# session.query(orm.ModelParameter) -# .filter(orm.ModelParameter.model_id == payload.get("left")) -# .all() -# ) -# payload["parameters"] = [] -# for parameter in parameters: -# payload["parameters"].append(parameter.__dict__) -# -# for param in payload.get("parameters"): -# session.add( -# orm.ModelParameter( -# model_id=new_model.id, -# name=param.get("name"), -# default_value=param.get("default_value"), -# type=param.get("type"), -# state_variable=param.get("state_variable"), -# ) -# ) -# session.commit() -# -# if settings.NEO4J_ENABLED: -# provenance_handler = ProvenanceHandler(rdb=rdb, graph_db=graph_db) -# prov_payload = Provenance( -# left=state.id, -# left_type="ModelRevision", -# right=l_model.state_id, -# right_type="ModelRevision", -# relation_type=model_opt_relationship_mapping[model_operation], -# user_id=payload.get("user_id", None), -# concept=".", -# ) -# provenance_handler.create_entry(prov_payload) -# -# if model_operation == "glue" and payload.get("right", False): -# prov_payload = Provenance( -# left=state.id, -# left_type="ModelRevision", -# right=r_model.state_id, -# right_type="ModelRevision", -# relation_type=model_opt_relationship_mapping[model_operation], -# user_id=payload.get("user_id", None), -# concept=".", -# ) -# provenance_handler.create_entry(prov_payload) -# -# # add begins at relationship -# prov_payload = Provenance( -# left=new_model.id, -# left_type="Model", -# right=state.id, -# right_type="ModelRevision", -# relation_type="BEGINS_AT", -# user_id=payload.get("user_id", None), -# concept=".", -# ) -# provenance_handler.create_entry(prov_payload) -# -# # get recently added parameters for the new model -# parameters: Query[orm.ModelParameter] = session.query( -# orm.ModelParameter -# ).filter(orm.ModelParameter.model_id == new_model.id) -# -# created_parameters = orm_to_params(list(parameters)) -# # add ModelParameter nodes -# for parameter in created_parameters: -# payload = Provenance( -# left=parameter.get("id"), -# left_type="ModelParameter", -# right=new_model.state_id, -# right_type="ModelRevision", -# relation_type="PARAMETER_OF", -# user_id=None, -# concept=".", -# ) -# provenance_handler.create_entry(payload) -# -# logger.info("new model created: %i", id) -# return Response( -# status_code=status.HTTP_201_CREATED, -# headers={ -# "content-type": "application/json", -# }, -# content=json.dumps({"id": new_model.id}), -# ) From eb9041af4965e91c8d27fbc621fe655dc5ea49a1 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 08:49:24 -0700 Subject: [PATCH 056/140] Removing model router. --- tds/routers/models.py | 75 ------------------------------------------- 1 file changed, 75 deletions(-) delete mode 100644 tds/routers/models.py diff --git a/tds/routers/models.py b/tds/routers/models.py deleted file mode 100644 index 32650c013..000000000 --- a/tds/routers/models.py +++ /dev/null @@ -1,75 +0,0 @@ -""" -CRUD operations for models -""" - -import json -from logging import Logger - -from fastapi import APIRouter, Depends, HTTPException, Response, status -from sqlalchemy.engine.base import Engine -from sqlalchemy.orm import Session - -from tds.db import request_rdb -from tds.modules.model.model import ModelFramework, ModelFrameworkPayload -from tds.operation import create, delete, retrieve - -logger = Logger(__name__) -router = APIRouter() - - -@router.post("/frameworks", **create.fastapi_endpoint_config) -def create_framework( - payload: ModelFrameworkPayload, rdb: Engine = Depends(request_rdb) -) -> Response: - """ - Create framework metadata - """ - - with Session(rdb) as session: - framework_payload = payload.dict() - framework = ModelFramework(**framework_payload) - session.add(framework) - session.commit() - name: str = framework.name - logger.info("new framework with %i", name) - return Response( - status_code=status.HTTP_201_CREATED, - headers={ - "content-type": "application/json", - }, - content=json.dumps({"name": name}), - ) - - -@router.get("/frameworks/{name}", **retrieve.fastapi_endpoint_config) -def get_framework(name: str, rdb: Engine = Depends(request_rdb)) -> ModelFramework: - """ - Retrieve framework metadata - """ - with Session(rdb) as session: - if ( - session.query(ModelFramework).filter(ModelFramework.name == name).count() - == 1 - ): - return ModelFramework.from_orm(session.query(ModelFramework).get(name)) - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) - - -@router.delete("/frameworks/{name}", **delete.fastapi_endpoint_config) -def delete_framework(name: str, rdb: Engine = Depends(request_rdb)) -> Response: - """ - Delete framework metadata - """ - with Session(rdb) as session: - if ( - session.query(ModelFramework).filter(ModelFramework.name == name).count() - == 1 - ): - framework = session.query(ModelFramework).get(name) - session.delete(framework) - session.commit() - else: - raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) - return Response( - status_code=status.HTTP_204_NO_CONTENT, - ) From 54adbdc6b04e2ed816ed8ab54b4549819d0cd2e5 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 08:49:46 -0700 Subject: [PATCH 057/140] Removed unused response function. --- tds/modules/project/response.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tds/modules/project/response.py b/tds/modules/project/response.py index 45b5cf2d1..963a9d5e6 100644 --- a/tds/modules/project/response.py +++ b/tds/modules/project/response.py @@ -18,10 +18,3 @@ class ProjectResponse(BaseModel): timestamp: Optional[datetime] = datetime.now() active: bool username: Optional[str] - - -def project_response(project_list): - """ - Function builds list of projects for response. - """ - return [ProjectResponse(**x["_source"]) for x in project_list] From f582e550b92684b4c5f8a96795825c2d65132f45 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 08:51:22 -0700 Subject: [PATCH 058/140] Adding model framework module. --- tds/modules/framework/__init__.py | 10 ++ tds/modules/framework/controller.py | 193 ++++++++++++++++++++++++++++ tds/modules/framework/response.py | 17 +++ 3 files changed, 220 insertions(+) create mode 100644 tds/modules/framework/__init__.py create mode 100644 tds/modules/framework/controller.py create mode 100644 tds/modules/framework/response.py diff --git a/tds/modules/framework/__init__.py b/tds/modules/framework/__init__.py new file mode 100644 index 000000000..4c52568ba --- /dev/null +++ b/tds/modules/framework/__init__.py @@ -0,0 +1,10 @@ +""" + TDS Framework Module. + + A simple REST module that creates the basic endpoints for an entity in + Terarium Data Service (TDS). +""" +from tds.modules.framework.controller import framework_router as router + +ROUTE_PREFIX = "frameworks" +TAGS = ["Framework"] diff --git a/tds/modules/framework/controller.py b/tds/modules/framework/controller.py new file mode 100644 index 000000000..bb7c5021c --- /dev/null +++ b/tds/modules/framework/controller.py @@ -0,0 +1,193 @@ +""" +TDS Framework Controller. +""" +from logging import Logger + +from fastapi import APIRouter, Depends, Response, status +from fastapi.encoders import jsonable_encoder +from fastapi.responses import JSONResponse +from sqlalchemy.engine.base import Engine +from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm import Session +from sqlalchemy.orm.exc import NoResultFound + +from tds.db import request_rdb +from tds.modules.framework.response import ModelFrameworkResponse +from tds.modules.model.model import ModelFramework, ModelFrameworkPayload +from tds.operation import create, delete, retrieve, update + +framework_router = APIRouter() +logger = Logger(__name__) + + +@framework_router.get( + "", response_model=list[ModelFrameworkResponse], **retrieve.fastapi_endpoint_config +) +def list_frameworks( + page_size: int = 100, page: int = 0, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Retrieve the list of frameworks. + """ + with Session(rdb) as session: + frameworks = session.query(ModelFramework).all() + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content=jsonable_encoder(frameworks), + ) + + +@framework_router.post("", **create.fastapi_endpoint_config) +def framework_post( + payload: ModelFrameworkPayload, rdb: Engine = Depends(request_rdb) +) -> JSONResponse: + """ + Create framework and return its ID + """ + framework_payload = payload.dict() + name = framework_payload["name"] + try: + with Session(rdb) as session: + model_framework = ModelFramework(**framework_payload) + session.add(model_framework) + session.commit() + + return JSONResponse( + status_code=status.HTTP_201_CREATED, + headers={ + "content-type": "application/json", + }, + content={"name": name}, + ) + except IntegrityError: + return JSONResponse( + status_code=status.HTTP_400_BAD_REQUEST, + headers={ + "content-type": "application/json", + }, + content={"message": f"A framework with the name {name} already exists."}, + ) + + +@framework_router.get( + "/{framework_name}", + response_model=ModelFrameworkResponse, + **retrieve.fastapi_endpoint_config, +) +def framework_get( + framework_name: str, rdb: Engine = Depends(request_rdb) +) -> JSONResponse | Response: + """ + Retrieve a framework from ElasticSearch + """ + try: + with Session(rdb) as session: + framework = ( + session.query(ModelFramework) + .filter(ModelFramework.name == framework_name) + .all() + ) + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content=jsonable_encoder(framework), + ) + except NoResultFound: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={ + "content-type": "application/json", + }, + content={ + "message": f"Model Framework with id {framework_name} does not exist." + }, + ) + + +@framework_router.put("/{framework_name}", **update.fastapi_endpoint_config) +def framework_put( + framework_name: str, + payload: ModelFrameworkPayload, + rdb: Engine = Depends(request_rdb), +) -> JSONResponse | Response: + """ + Update a framework in ElasticSearch + """ + try: + framework_payload = payload.dict() + with Session(rdb) as session: + if ( + session.query(ModelFramework) + .filter(ModelFramework.name == framework_name) + .count() + > 0 + ): + session.query(ModelFramework).filter( + ModelFramework.name == framework_name + ).update(framework_payload) + session.commit() + logger.info("framework updated: %s", framework_name) + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content={"name": framework_name}, + ) + raise NoResultFound + except NoResultFound: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={ + "content-type": "application/json", + }, + content={ + "message": f"Framework with name {framework_name} does not exist." + }, + ) + + +@framework_router.delete("/{framework_name}", **delete.fastapi_endpoint_config) +def framework_delete( + framework_name: str, rdb: Engine = Depends(request_rdb) +) -> JSONResponse | Response: + """ + Delete a Framework in ElasticSearch + """ + try: + with Session(rdb) as session: + if ( + session.query(ModelFramework) + .filter(ModelFramework.name == framework_name) + .count() + > 0 + ): + session.query(ModelFramework).filter( + ModelFramework.name == framework_name + ).delete() + session.commit() + success_msg = f"Framework successfully deleted: {framework_name}" + logger.info(success_msg) + return JSONResponse( + status_code=status.HTTP_200_OK, + headers={ + "content-type": "application/json", + }, + content={"message": success_msg}, + ) + raise NoResultFound + except NoResultFound: + return JSONResponse( + status_code=status.HTTP_404_NOT_FOUND, + headers={ + "content-type": "application/json", + }, + content={ + "message": f"Framework with name {framework_name} does not exist." + }, + ) diff --git a/tds/modules/framework/response.py b/tds/modules/framework/response.py new file mode 100644 index 000000000..30e437bb4 --- /dev/null +++ b/tds/modules/framework/response.py @@ -0,0 +1,17 @@ +""" +TDS Framework Response object. +""" +from datetime import datetime + +from pydantic import BaseModel + + +class ModelFrameworkResponse(BaseModel): + """ + Framework Response Object. + """ + + id: str + name: str + description: str + timestamp: datetime From bff38c6bd94b52d0ce7a9a8945097985cabec40f Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 08:53:16 -0700 Subject: [PATCH 059/140] Removed routers package. --- tds/routers/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tds/routers/__init__.py diff --git a/tds/routers/__init__.py b/tds/routers/__init__.py deleted file mode 100644 index e69de29bb..000000000 From f75f9617cc1e9b7b4af0620b763f94847cf5b704 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 08:53:30 -0700 Subject: [PATCH 060/140] Removed old router logic. --- tds/server/build.py | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/tds/server/build.py b/tds/server/build.py index 219044314..6a143fab5 100644 --- a/tds/server/build.py +++ b/tds/server/build.py @@ -12,33 +12,6 @@ API_DESCRIPTION = "TDS handles data between TERArium and other ASKEM components." -def find_valid_routers() -> List[str]: - """ - Generate list of module names that are possible to import - """ - router = import_module("tds.routers") - return [module.name for module in iter_modules(router.__path__)] - - -def attach_router(api: FastAPI, router_name: str) -> None: - """ - Import router module dynamically and attach it to the API - - At runtime, the routes to be used can be specified instead of - being hardcoded. - """ - router_package = import_module(f"tds.routers.{router_name}") - api.include_router( - router_package.router, tags=[router_name], prefix="/" + router_name - ) - - if api.openapi_tags is None: - api.openapi_tags = [] - api.openapi_tags.append( - {"name": router_name, "description": router_package.__doc__} - ) - - def load_module_routers(api): """ Function loads the module router objects and registers them with FastAPI. @@ -76,7 +49,4 @@ def build_api(*args: str) -> FastAPI: # Load routers from the modules package. load_module_routers(api) - for router_name in args if len(args) != 0 else find_valid_routers(): - attach_router(api, router_name) - return api From 15086d29048d1aeb480abc63fdb0f9a9d0768aea Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 08:58:36 -0700 Subject: [PATCH 061/140] Fixing CodeQL warning. --- tds/modules/person/controller.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tds/modules/person/controller.py b/tds/modules/person/controller.py index 6b4a72716..6c62c270e 100644 --- a/tds/modules/person/controller.py +++ b/tds/modules/person/controller.py @@ -64,12 +64,13 @@ def person_post( content={"id": record.id}, ) except Exception as error: + logger.error(error) return JSONResponse( status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, headers={ "content-type": "application/json", }, - content={"message": f"Person was not created. {error}"}, + content={"message": f"Person was not created."}, ) From 48c537657d907baea23ecd2637033520fbea75ae Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 08:59:24 -0700 Subject: [PATCH 062/140] Linter clean up. --- tds/server/build.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tds/server/build.py b/tds/server/build.py index 6a143fab5..6e3e32fd7 100644 --- a/tds/server/build.py +++ b/tds/server/build.py @@ -4,7 +4,6 @@ from importlib import import_module, metadata from pkgutil import iter_modules -from typing import List from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware @@ -24,7 +23,7 @@ def load_module_routers(api): ) -def build_api(*args: str) -> FastAPI: +def build_api() -> FastAPI: """ Build an API using a group of specified router modules """ From 0bdb744ff18ed9e7871bcbb14e5a6bd199d98ed4 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 09:00:00 -0700 Subject: [PATCH 063/140] Linter clean up 1. --- tds/modules/person/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tds/modules/person/model.py b/tds/modules/person/model.py index 9e86d1b2e..b2b13b736 100644 --- a/tds/modules/person/model.py +++ b/tds/modules/person/model.py @@ -1,7 +1,7 @@ """ TDS Person Data Model Definition. """ -from typing import Any, List, Optional +from typing import Optional import sqlalchemy as sa from pydantic import BaseModel From b416661fa13f63b9b5a53bd122c8aaff65270504 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 09:05:12 -0700 Subject: [PATCH 064/140] Converted general error to general db error for linter. --- tds/modules/person/controller.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tds/modules/person/controller.py b/tds/modules/person/controller.py index 6c62c270e..4bb7f358a 100644 --- a/tds/modules/person/controller.py +++ b/tds/modules/person/controller.py @@ -7,6 +7,7 @@ from fastapi.encoders import jsonable_encoder from fastapi.responses import JSONResponse from sqlalchemy.engine.base import Engine +from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm import Session from sqlalchemy.orm.exc import NoResultFound @@ -63,7 +64,7 @@ def person_post( }, content={"id": record.id}, ) - except Exception as error: + except SQLAlchemyError as error: logger.error(error) return JSONResponse( status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, From 039a26f0ef519e027d41763137f2030240a23d67 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 09:09:43 -0700 Subject: [PATCH 065/140] Linter sweep. --- tds/modules/external/controller.py | 10 ++++------ tds/modules/framework/controller.py | 4 +--- tds/modules/person/controller.py | 3 ++- tds/modules/project/helpers.py | 1 - 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/tds/modules/external/controller.py b/tds/modules/external/controller.py index dea8970fb..c6ae4ba19 100644 --- a/tds/modules/external/controller.py +++ b/tds/modules/external/controller.py @@ -30,9 +30,7 @@ response_model=list[SoftwarePayload], **retrieve.fastapi_endpoint_config, ) -def list_software( - page_size: int = 100, page: int = 0, rdb: Engine = Depends(request_rdb) -) -> JSONResponse: +def list_software(rdb: Engine = Depends(request_rdb)) -> JSONResponse: """ Retrieve list of software from db. """ @@ -124,6 +122,7 @@ def software_put( }, content={"id": software_id}, ) + raise NoResultFound except NoResultFound: return JSONResponse( status_code=status.HTTP_404_NOT_FOUND, @@ -172,9 +171,7 @@ def software_delete( response_model=PublicationPayload, **retrieve.fastapi_endpoint_config, ) -def publication_list( - page_size: int = 100, page: int = 0, rdb: Engine = Depends(request_rdb) -) -> JSONResponse: +def publication_list(rdb: Engine = Depends(request_rdb)) -> JSONResponse: """ Retrieve a publication record from DB. """ @@ -284,6 +281,7 @@ def publication_put( }, content={"id": publication_id}, ) + raise NoResultFound except NoResultFound: return JSONResponse( status_code=status.HTTP_404_NOT_FOUND, diff --git a/tds/modules/framework/controller.py b/tds/modules/framework/controller.py index bb7c5021c..e0fc23329 100644 --- a/tds/modules/framework/controller.py +++ b/tds/modules/framework/controller.py @@ -23,9 +23,7 @@ @framework_router.get( "", response_model=list[ModelFrameworkResponse], **retrieve.fastapi_endpoint_config ) -def list_frameworks( - page_size: int = 100, page: int = 0, rdb: Engine = Depends(request_rdb) -) -> JSONResponse: +def list_frameworks(rdb: Engine = Depends(request_rdb)) -> JSONResponse: """ Retrieve the list of frameworks. """ diff --git a/tds/modules/person/controller.py b/tds/modules/person/controller.py index 4bb7f358a..661896ce8 100644 --- a/tds/modules/person/controller.py +++ b/tds/modules/person/controller.py @@ -71,7 +71,7 @@ def person_post( headers={ "content-type": "application/json", }, - content={"message": f"Person was not created."}, + content={"message": "Person was not created."}, ) @@ -129,6 +129,7 @@ def person_put( headers={"content-type": "application/json"}, content={"id": person_id}, ) + raise NoResultFound except NoResultFound as error: return JSONResponse( status_code=status.HTTP_404_NOT_FOUND, diff --git a/tds/modules/project/helpers.py b/tds/modules/project/helpers.py index 0b3e3ff5a..c33b82680 100644 --- a/tds/modules/project/helpers.py +++ b/tds/modules/project/helpers.py @@ -56,7 +56,6 @@ def save_project(project: dict, session): Function saves the project from a payload dict. """ asset_dict = project.pop("assets") - asset_records = [] assets = check_assets(assets=asset_dict) if assets: From 7a757a445bfebd3307cd05e25936974e0d519057 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Thu, 13 Jul 2023 09:14:41 -0700 Subject: [PATCH 066/140] Added bypass when module is not a route object. --- tds/server/build.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tds/server/build.py b/tds/server/build.py index 6e3e32fd7..8778bd1f5 100644 --- a/tds/server/build.py +++ b/tds/server/build.py @@ -18,9 +18,10 @@ def load_module_routers(api): modules = import_module("tds.modules") for mod in iter_modules(modules.__path__): module = import_module(f"tds.modules.{mod.name}") - api.include_router( - module.router, tags=module.TAGS, prefix="/" + module.ROUTE_PREFIX - ) + if hasattr(module, "router"): + api.include_router( + module.router, tags=module.TAGS, prefix="/" + module.ROUTE_PREFIX + ) def build_api() -> FastAPI: From 4de4bca5c805212610e1f0fbe1a8ae88346a556c Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Mon, 31 Jul 2023 10:55:03 -0700 Subject: [PATCH 067/140] Moving tests to old_tests. --- {tests => old_tests}/__init__.py | 0 {tests => old_tests}/helpers.py | 0 {tests => old_tests}/migrations.py | 0 {tests => old_tests}/search.py | 0 {tests => old_tests}/service.py | 6 +++--- {tests => old_tests}/suite.py | 0 {tests => old_tests}/unittest.py | 0 7 files changed, 3 insertions(+), 3 deletions(-) rename {tests => old_tests}/__init__.py (100%) rename {tests => old_tests}/helpers.py (100%) rename {tests => old_tests}/migrations.py (100%) rename {tests => old_tests}/search.py (100%) rename {tests => old_tests}/service.py (100%) rename {tests => old_tests}/suite.py (100%) rename {tests => old_tests}/unittest.py (100%) diff --git a/tests/__init__.py b/old_tests/__init__.py similarity index 100% rename from tests/__init__.py rename to old_tests/__init__.py diff --git a/tests/helpers.py b/old_tests/helpers.py similarity index 100% rename from tests/helpers.py rename to old_tests/helpers.py diff --git a/tests/migrations.py b/old_tests/migrations.py similarity index 100% rename from tests/migrations.py rename to old_tests/migrations.py diff --git a/tests/search.py b/old_tests/search.py similarity index 100% rename from tests/search.py rename to old_tests/search.py diff --git a/tests/service.py b/old_tests/service.py similarity index 100% rename from tests/service.py rename to old_tests/service.py index 550699b11..e904280b4 100644 --- a/tests/service.py +++ b/old_tests/service.py @@ -5,14 +5,14 @@ from pytest import mark from sqlalchemy.orm import Session +from tests.suite import AllowedMethod +from tests.suite import ASKEMEntityTestSuite as AETS +from tests.suite import expected_status from tds.autogen import orm from tds.db.enums import ResourceType, ValueType from tds.modules.model.model import ModelFramework from tds.schema.resource import Publication, Software -from tests.suite import AllowedMethod -from tests.suite import ASKEMEntityTestSuite as AETS -from tests.suite import expected_status # TODO: The assets endpoints need testing diff --git a/tests/suite.py b/old_tests/suite.py similarity index 100% rename from tests/suite.py rename to old_tests/suite.py diff --git a/tests/unittest.py b/old_tests/unittest.py similarity index 100% rename from tests/unittest.py rename to old_tests/unittest.py From 16e5c87677a6624af68b9f9ea44db0757e98a539 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 1 Aug 2023 10:26:22 -0700 Subject: [PATCH 068/140] Adding test deps. --- pyproject.toml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 68c866695..230215d27 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,6 +46,9 @@ pre-commit = "^3.1.1" pytest-alembic = "^0.10.0" pytest-mock-resources = "^2.6.8" python-on-whales = "^0.59.0" +moto = "^4.1.14" +pytest-elasticsearch = "^4.0.0" +pytest-mock = "^3.11.1" [build-system] requires = ["poetry-core"] @@ -63,7 +66,9 @@ profile = "black" [tool.pytest.ini_options] addopts = "--ignore-glob=*utils.py" -python_files = ["tests/service.py", "tests/unittest.py", "tests/search.py", "tests/migrations.py"] +testpaths = [ + "tests", +] filterwarnings = ["ignore::DeprecationWarning"] [tool.pylint.master] From 064a5acd730e5b1d91b212cefd763fd22fa22615 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 1 Aug 2023 10:27:01 -0700 Subject: [PATCH 069/140] Added new tests. --- tests/Model/conftest.py | 573 ++++++++++++++++++++++++++++++++++++++ tests/Model/test_model.py | 81 ++++++ tests/conftest.py | 67 +++++ 3 files changed, 721 insertions(+) create mode 100644 tests/Model/conftest.py create mode 100644 tests/Model/test_model.py create mode 100644 tests/conftest.py diff --git a/tests/Model/conftest.py b/tests/Model/conftest.py new file mode 100644 index 000000000..1f81385ab --- /dev/null +++ b/tests/Model/conftest.py @@ -0,0 +1,573 @@ +from pytest import fixture + + +@fixture() +def model_json(): + return { + "name": "SIR Model", + "username": "Adam Smith", + "schema": "https://raw.githubusercontent.com/DARPA-ASKEM/Model-Representations/petrinet_v0.5/petrinet/petrinet_schema.json", + "description": "SIR model", + "schema_name": "petrinet", + "model_version": "0.1", + "model": { + "states": [ + { + "id": "S", + "name": "Susceptible", + "description": "Number of individuals that are 'susceptible' to a disease infection", + "grounding": {"identifiers": {"ido": "0000514"}}, + "units": { + "expression": "person", + "expression_mathml": "person", + }, + }, + { + "id": "I", + "name": "Infected", + "description": "Number of individuals that are 'infected' by a disease", + "grounding": {"identifiers": {"ido": "0000511"}}, + "units": { + "expression": "person", + "expression_mathml": "person", + }, + }, + { + "id": "R", + "name": "Recovered", + "description": "Number of individuals that have 'recovered' from a disease infection", + "grounding": {"identifiers": {"ido": "0000592"}}, + "units": { + "expression": "person", + "expression_mathml": "person", + }, + }, + ], + "transitions": [ + { + "id": "inf", + "input": ["S", "I"], + "output": ["I", "I"], + "properties": { + "name": "Infection", + "description": "Infective process between individuals", + }, + }, + { + "id": "rec", + "input": ["I"], + "output": ["R"], + "properties": { + "name": "Recovery", + "description": "Recovery process of a infected individual", + }, + }, + ], + }, + "semantics": { + "ode": { + "rates": [ + { + "target": "inf", + "expression": "S*I*beta", + "expression_mathml": "SIbeta", + }, + { + "target": "rec", + "expression": "I*gamma", + "expression_mathml": "Igamma", + }, + ], + "initials": [ + { + "target": "S", + "expression": "S0", + "expression_mathml": "S0", + }, + { + "target": "I", + "expression": "I0", + "expression_mathml": "I0", + }, + { + "target": "R", + "expression": "R0", + "expression_mathml": "R0", + }, + ], + "parameters": [ + { + "id": "beta", + "name": "β", + "description": "infection rate", + "units": { + "expression": "1/(person*day)", + "expression_mathml": "1personday", + }, + "value": 2.7e-7, + "distribution": { + "type": "Uniform1", + "parameters": {"minimum": 2.6e-7, "maximum": 2.8e-7}, + }, + }, + { + "id": "gamma", + "name": "γ", + "description": "recovery rate", + "grounding": {"identifiers": {"askemo": "0000013"}}, + "units": { + "expression": "1/day", + "expression_mathml": "1day", + }, + "value": 0.14, + "distribution": { + "type": "Uniform1", + "parameters": {"minimum": 0.1, "maximum": 0.18}, + }, + }, + { + "id": "S0", + "name": "S₀", + "description": "Total susceptible population at timestep 0", + "value": 1000, + }, + { + "id": "I0", + "name": "I₀", + "description": "Total infected population at timestep 0", + "value": 1, + }, + { + "id": "R0", + "name": "R₀", + "description": "Total recovered population at timestep 0", + "value": 0, + }, + ], + "observables": [ + { + "id": "noninf", + "name": "Non-infectious", + "states": ["S", "R"], + "expression": "S+R", + "expression_mathml": "SR", + } + ], + "time": { + "id": "t", + "units": {"expression": "day", "expression_mathml": "day"}, + }, + } + }, + "metadata": { + "attributes": [ + { + "type": "anchored_extraction", + "payload": { + "id": {"id": "R:190348269"}, + "names": [ + { + "id": {"id": "T:-1709799622"}, + "name": "Bucky", + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 738, + "char_end": 743, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.974474", + }, + } + ], + "descriptions": [ + { + "id": {"id": "T:-486841659"}, + "source": "time", + "grounding": [ + { + "grounding_text": "time since time scale zero", + "grounding_id": "apollosv:00000272", + "source": [], + "score": 0.8945620059967041, + "provenance": { + "method": "SKEMA-TR-Embedding", + "timestamp": "2023-06-15T22:59:11.974644", + }, + } + ], + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 732, + "char_end": 736, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.974474", + }, + } + ], + "value_specs": [], + "groundings": [], + }, + }, + { + "type": "anchored_extraction", + "payload": { + "id": {"id": "R:159895595"}, + "names": [ + { + "id": {"id": "T:2131207786"}, + "name": "SEIR", + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 56, + "char_end": 60, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.974780", + }, + } + ], + "descriptions": [ + { + "id": {"id": "T:-1520869470"}, + "source": "spatially distributed", + "grounding": [], + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 34, + "char_end": 55, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.974780", + }, + } + ], + "value_specs": [], + "groundings": [], + }, + }, + { + "type": "anchored_extraction", + "payload": { + "id": {"id": "E:-337831219"}, + "names": [ + { + "id": {"id": "T:1326919589"}, + "name": "S", + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 562, + "char_end": 563, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.974931", + }, + } + ], + "descriptions": [ + { + "id": {"id": "T:1687413640"}, + "source": "fraction of the population", + "grounding": [ + { + "grounding_text": "count of simulated population", + "grounding_id": "apollosv:00000022", + "source": [], + "score": 0.8330355286598206, + "provenance": { + "method": "SKEMA-TR-Embedding", + "timestamp": "2023-06-15T22:59:11.975009", + }, + } + ], + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 570, + "char_end": 596, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.974931", + }, + } + ], + "value_specs": [], + "groundings": [ + { + "grounding_text": "Meruvax I", + "grounding_id": "vo:0003109", + "source": [], + "score": 0.7847759127616882, + "provenance": { + "method": "SKEMA-TR-Embedding", + "timestamp": "2023-06-15T22:59:11.974960", + }, + } + ], + }, + }, + { + "type": "anchored_extraction", + "payload": { + "id": {"id": "E:-1921441554"}, + "names": [ + { + "id": {"id": "T:-24678027"}, + "name": "asym frac", + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 142, + "char_end": 151, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.975127", + }, + }, + { + "id": {"id": "v10"}, + "name": "\u03b1", + "extraction_source": None, + "provenance": { + "method": "MIT extractor V1.0 - text, dataset, formula annotation (chunwei@mit.edu)", + "timestamp": "2023-06-15T22:59:13.177022", + }, + }, + ], + "descriptions": [ + { + "id": {"id": "T:1244663286"}, + "source": "percentage of infections", + "grounding": [ + { + "grounding_text": "percentage of cases", + "grounding_id": "cemo:percentage_of_cases", + "source": [], + "score": 0.8812347650527954, + "provenance": { + "method": "SKEMA-TR-Embedding", + "timestamp": "2023-06-15T22:59:11.975201", + }, + } + ], + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 94, + "char_end": 118, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.975127", + }, + }, + { + "id": {"id": "v10"}, + "source": " Rate of infections that are asymptomatic", + "grounding": None, + "extraction_source": None, + "provenance": { + "method": "MIT extractor V1.0 - text, dataset, formula annotation (chunwei@mit.edu)", + "timestamp": "2023-06-15T22:59:13.177022", + }, + }, + ], + "value_specs": [], + "groundings": [ + { + "grounding_text": "Van", + "grounding_id": "geonames:298117", + "source": [], + "score": 1.0, + "provenance": { + "method": "MIT extractor V1.0 - text, dataset, formula annotation (chunwei@mit.edu)", + "timestamp": "2023-06-15T22:59:13.177022", + }, + }, + { + "grounding_text": "Sanaa", + "grounding_id": "geonames:71137", + "source": [], + "score": 1.0, + "provenance": { + "method": "MIT extractor V1.0 - text, dataset, formula annotation (chunwei@mit.edu)", + "timestamp": "2023-06-15T22:59:13.177022", + }, + }, + ], + }, + }, + { + "type": "anchored_extraction", + "payload": { + "id": {"id": "E:392549189"}, + "names": [ + { + "id": {"id": "T:-24678027"}, + "name": "asym frac", + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 142, + "char_end": 151, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.975270", + }, + }, + { + "id": {"id": "v18"}, + "name": "asym_frac", + "extraction_source": None, + "provenance": { + "method": "MIT extractor V1.0 - text, dataset, formula annotation (chunwei@mit.edu)", + "timestamp": "2023-06-15T22:59:13.177022", + }, + }, + ], + "descriptions": [ + { + "id": {"id": "T:1244663286"}, + "source": "percentage of infections", + "grounding": [ + { + "grounding_text": "percentage of cases", + "grounding_id": "cemo:percentage_of_cases", + "source": [], + "score": 0.8812347650527954, + "provenance": { + "method": "SKEMA-TR-Embedding", + "timestamp": "2023-06-15T22:59:11.975340", + }, + } + ], + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 94, + "char_end": 118, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.975270", + }, + }, + { + "id": {"id": "v18"}, + "source": " Fraction of infections that are asymptomatic", + "grounding": None, + "extraction_source": None, + "provenance": { + "method": "MIT extractor V1.0 - text, dataset, formula annotation (chunwei@mit.edu)", + "timestamp": "2023-06-15T22:59:13.177022", + }, + }, + ], + "value_specs": [], + "groundings": [], + }, + }, + { + "type": "anchored_extraction", + "payload": { + "id": {"id": "E:-1790112729"}, + "names": [ + { + "id": {"id": "T:-24678027"}, + "name": "asym frac", + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 142, + "char_end": 151, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.975409", + }, + } + ], + "descriptions": [ + { + "id": {"id": "T:1244663286"}, + "source": "percentage of infections", + "grounding": [ + { + "grounding_text": "percentage of cases", + "grounding_id": "cemo:percentage_of_cases", + "source": [], + "score": 0.8812347650527954, + "provenance": { + "method": "SKEMA-TR-Embedding", + "timestamp": "2023-06-15T22:59:11.975479", + }, + } + ], + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 94, + "char_end": 118, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.975409", + }, + } + ], + "value_specs": [], + "groundings": [], + }, + }, + ] + }, + } diff --git a/tests/Model/test_model.py b/tests/Model/test_model.py new file mode 100644 index 000000000..904f35f3d --- /dev/null +++ b/tests/Model/test_model.py @@ -0,0 +1,81 @@ +""" +Model test for TDS. +""" + + +class TestModelEndpoints: + _model_id = None + + def test_post( + self, _mock_elasticsearch, fast_api_fixture, fast_api_test_url, model_json + ): + response = fast_api_fixture.post( + url=f"{fast_api_test_url}/models", + json=model_json, + ) + response_json = response.json() + assert response.status_code == 201 + assert "id" in response_json + self._model_id = response_json["id"] + + def test_put( + self, _mock_elasticsearch, fast_api_fixture, fast_api_test_url, model_json + ): + put_data = model_json + new_name = "{name} updated".format(name=model_json["name"]) + put_data["id"] = self._model_id + put_data["name"] = new_name + response = fast_api_fixture.put( + url=f"{fast_api_test_url}/models/{self._model_id}", + json=put_data, + ) + response_json = response.json() + assert response.status_code == 200 + assert "id" in response_json and response_json["id"] == self._model_id + + def test_get( + self, _mock_elasticsearch, fast_api_fixture, fast_api_test_url, model_json + ): + response = fast_api_fixture.get( + url=f"{fast_api_test_url}/models/{self._model_id}", + ) + response_json = response.json() + assert response.status_code == 200 + assert "id" in response_json and response_json["id"] == self._model_id + assert "timestamp" in response_json + + def test_post_fail( + self, _mock_elasticsearch, fast_api_fixture, fast_api_test_url, model_json + ): + fail_data = model_json + del fail_data["name"] + del fail_data["model"] + response = fast_api_fixture.post( + url=f"{fast_api_test_url}/models", + json=model_json, + ) + response_json = response.json() + assert response.status_code == 422 + assert "detail" in response_json + + def test_put_fail( + self, _mock_elasticsearch, fast_api_fixture, fast_api_test_url, model_json + ): + fail_data = model_json + del fail_data["name"] + del fail_data["model"] + response = fast_api_fixture.put( + url=f"{fast_api_test_url}/models/{self._model_id}", + json=model_json, + ) + response_json = response.json() + assert response.status_code == 422 + assert "detail" in response_json + + def test_get_fail( + self, _mock_elasticsearch, fast_api_fixture, fast_api_test_url, model_json + ): + response = fast_api_fixture.get( + url=f"{fast_api_test_url}/models/id-does-not-exist", + ) + assert response.status_code == 404 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 000000000..c9853dece --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,67 @@ +import os + +import boto3 +import elasticsearch +from elasticsearch import Elasticsearch +from fastapi.testclient import TestClient +from moto import mock_s3 +from pytest import fixture +from pytest_elasticsearch import factories + +from tds.server.build import build_api + +os.environ["TDS_HOST_PORT"] = "8888" +os.environ["SQL_URL"] = "localhost" +os.environ["SQL_PORT"] = "5432" +os.environ["SQL_USER"] = "dev" +os.environ["SQL_PASSWORD"] = "dev" +os.environ["SQL_DB"] = "askem" +os.environ["DKG_URL"] = "http://dpk" +os.environ["DKG_API_PORT"] = "8771" +os.environ["DKG_DESC_PORT"] = "8772" +os.environ["S3_BUCKET"] = "test-data-service-data" +os.environ["S3_DATASET_PATH"] = "test-datasets" +os.environ["S3_RESULTS_PATH"] = "test-simulations" +os.environ["S3_ARTIFACT_PATH"] = "test-artifacts" +os.environ["STORAGE_HOST"] = "http://test-minio:9000" +os.environ["AWS_ACCESS_KEY_ID"] = "askem-s3-test" +os.environ["AWS_SECRET_ACCESS_KEY"] = "testPass" +os.environ["AWS_REGION"] = "us-east-1" +os.environ["ES_URL"] = "http://test-es:9200" +os.environ["ES_HOST"] = "test-es" +os.environ["ES_PORT"] = "9200" + + +@fixture(autouse=True) +def s3_fixture(): + mock_s3().start() + resource = boto3.resource("s3", region_name="us-east-1") + + # Create the table + resource.create_bucket(Bucket=os.getenv("S3_BUCKET")) + yield resource + + mock_s3().stop() + + +@fixture(autouse=True) +def fast_api_fixture(): + fast_api = build_api() + yield TestClient(fast_api) + + +@fixture(autouse=True) +def fast_api_test_url(): + port = os.getenv("TDS_HOST_PORT") + return f"http://localhost:{port}" + + +@fixture(autouse=True) +def _mock_elasticsearch(): + # mocker.object.patch(Elasticsearch, "search") + elasticsearch_proc = factories.elasticsearch_proc( + host=os.getenv("ES_HOST"), + port=os.getenv("9200"), + network_publish_host=os.getenv("ES_HOST"), + ) + yield elasticsearch_proc From b0d684e7fb7c8f239a82aa37e343bbf6ddac60dd Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:34:44 -0700 Subject: [PATCH 070/140] Cleaned up docker file. --- docker/Dockerfile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index dd6af8399..aac2da347 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -6,14 +6,11 @@ WORKDIR /api ADD poetry.lock poetry.lock ADD pyproject.toml pyproject.toml RUN poetry config virtualenvs.create false -RUN poetry install --no-root -COPY tests tests +RUN poetry install --no-dev COPY tds tds COPY graph_relations.json graph_relations.json # Poetry complains if the README doesn't exist COPY README.md README.md -COPY migrate migrate -RUN poetry install --only-root EXPOSE 8000 CMD ["poetry", "run", "tds"] From 8cd51f250d2c2d975116a523099360d07dae8636 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:35:24 -0700 Subject: [PATCH 071/140] Cleaned up docker file. --- tests/conftest.py | 40 +++++----------------------------------- 1 file changed, 5 insertions(+), 35 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index c9853dece..622f981ea 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,35 +1,16 @@ import os import boto3 -import elasticsearch -from elasticsearch import Elasticsearch +import pytest from fastapi.testclient import TestClient from moto import mock_s3 from pytest import fixture -from pytest_elasticsearch import factories from tds.server.build import build_api -os.environ["TDS_HOST_PORT"] = "8888" -os.environ["SQL_URL"] = "localhost" -os.environ["SQL_PORT"] = "5432" -os.environ["SQL_USER"] = "dev" -os.environ["SQL_PASSWORD"] = "dev" -os.environ["SQL_DB"] = "askem" -os.environ["DKG_URL"] = "http://dpk" -os.environ["DKG_API_PORT"] = "8771" -os.environ["DKG_DESC_PORT"] = "8772" -os.environ["S3_BUCKET"] = "test-data-service-data" -os.environ["S3_DATASET_PATH"] = "test-datasets" -os.environ["S3_RESULTS_PATH"] = "test-simulations" -os.environ["S3_ARTIFACT_PATH"] = "test-artifacts" -os.environ["STORAGE_HOST"] = "http://test-minio:9000" -os.environ["AWS_ACCESS_KEY_ID"] = "askem-s3-test" -os.environ["AWS_SECRET_ACCESS_KEY"] = "testPass" -os.environ["AWS_REGION"] = "us-east-1" -os.environ["ES_URL"] = "http://test-es:9200" -os.environ["ES_HOST"] = "test-es" -os.environ["ES_PORT"] = "9200" + +def pytest_configure(): + pytest.model_id = None @fixture(autouse=True) @@ -37,7 +18,7 @@ def s3_fixture(): mock_s3().start() resource = boto3.resource("s3", region_name="us-east-1") - # Create the table + # Create the s3 bucket. resource.create_bucket(Bucket=os.getenv("S3_BUCKET")) yield resource @@ -54,14 +35,3 @@ def fast_api_fixture(): def fast_api_test_url(): port = os.getenv("TDS_HOST_PORT") return f"http://localhost:{port}" - - -@fixture(autouse=True) -def _mock_elasticsearch(): - # mocker.object.patch(Elasticsearch, "search") - elasticsearch_proc = factories.elasticsearch_proc( - host=os.getenv("ES_HOST"), - port=os.getenv("9200"), - network_publish_host=os.getenv("ES_HOST"), - ) - yield elasticsearch_proc From 712593a993c8e30354998849b4ae6b2afbc230c3 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:35:51 -0700 Subject: [PATCH 072/140] Refactored relational db for testing. --- tds/db/relational.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tds/db/relational.py b/tds/db/relational.py index a0999af77..f7f6df781 100644 --- a/tds/db/relational.py +++ b/tds/db/relational.py @@ -7,10 +7,12 @@ from tds.settings import settings # pylint: disable-next=line-too-long -url = f"postgresql+psycopg2://{settings.SQL_USER}:{settings.SQL_PASSWORD}@{settings.SQL_URL}:{settings.SQL_PORT}/{settings.SQL_DB}" -engine = create_engine( - url, pool_size=25, max_overflow=10, connect_args={"connect_timeout": 8} -) +sql_url = f"{settings.SQL_PROTOCOL}://{settings.SQL_USER}:{settings.SQL_PASSWORD}@{settings.SQL_URL}:{settings.SQL_PORT}/{settings.SQL_DB}" +sql_args = {"pool_size": 25, "max_overflow": 10, "connect_args": {"connect_timeout": 8}} +if settings.SQL_CONN_STR: + sql_url = settings.SQL_CONN_STR + sql_args = {} +engine = create_engine(sql_url, **sql_args) async def request_engine(): From b9b5d655b25f5b5e035e69421b719bdc02a00ab2 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:36:05 -0700 Subject: [PATCH 073/140] Updated migrate env for testing. --- migrate/env.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/migrate/env.py b/migrate/env.py index 32460c2e9..42a222783 100644 --- a/migrate/env.py +++ b/migrate/env.py @@ -38,6 +38,9 @@ def setup_context() -> str: url = config.get_main_option("sqlalchemy.url") url = re.sub(r"\${(.+?)}", lambda m: tokens[m.group(1)], url) + if os.getenv("SQL_CONN_STR", None): + url = os.getenv("SQL_CONN_STR") + return url From c8a5522a39a1d8b9a43510a876f37d58829d21c4 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:36:34 -0700 Subject: [PATCH 074/140] Refactored provenance migration for testing. --- .../0c372ef781b7_update_provenance_ids.py | 54 +++++++++---------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/migrate/versions/0c372ef781b7_update_provenance_ids.py b/migrate/versions/0c372ef781b7_update_provenance_ids.py index 4387aede6..9d4055572 100644 --- a/migrate/versions/0c372ef781b7_update_provenance_ids.py +++ b/migrate/versions/0c372ef781b7_update_provenance_ids.py @@ -19,34 +19,32 @@ def upgrade() -> None: - op.alter_column( - "provenance", - "left", - existing_type=sa.INTEGER(), - type_=sa.String(), - existing_nullable=False, - ) - op.alter_column( - "provenance", - "right", - existing_type=sa.INTEGER(), - type_=sa.String(), - existing_nullable=False, - ) + with op.batch_alter_table("provenance") as batch_op: + batch_op.alter_column( + "left", + existing_type=sa.INTEGER(), + type_=sa.String(), + existing_nullable=False, + ) + batch_op.alter_column( + "right", + existing_type=sa.INTEGER(), + type_=sa.String(), + existing_nullable=False, + ) def downgrade() -> None: - op.alter_column( - "provenance", - "right", - existing_type=sa.String(), - type_=sa.INTEGER(), - existing_nullable=False, - ) - op.alter_column( - "provenance", - "left", - existing_type=sa.String(), - type_=sa.INTEGER(), - existing_nullable=False, - ) + with op.batch_alter_table("provenance") as batch_op: + batch_op.alter_column( + "right", + existing_type=sa.String(), + type_=sa.INTEGER(), + existing_nullable=False, + ) + batch_op.alter_column( + "left", + existing_type=sa.String(), + type_=sa.INTEGER(), + existing_nullable=False, + ) From e56e2685fbfeb58bf3df90a7debddec6f0760127 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:37:04 -0700 Subject: [PATCH 075/140] Refactored init for testing. --- migrate/versions/1f5853959c65_init_db.py | 101 +++++++---------------- 1 file changed, 30 insertions(+), 71 deletions(-) diff --git a/migrate/versions/1f5853959c65_init_db.py b/migrate/versions/1f5853959c65_init_db.py index b554ada7a..4051dad15 100644 --- a/migrate/versions/1f5853959c65_init_db.py +++ b/migrate/versions/1f5853959c65_init_db.py @@ -6,84 +6,31 @@ """ # pylint: disable=no-member, invalid-name -from typing import Iterator +import os import sqlalchemy as sa from alembic import op from sqlalchemy.dialects import postgresql +from migrate.scripts.enums import ( + drop_enums, + extracted_type, + ontological_field, + provenance_type, + relation_type, + resource_type, + role, + taggable_type, + value_type, +) + # revision identifiers, used by Alembic. revision = "1f5853959c65" down_revision = None branch_labels = None depends_on = None - -# Alembic 1.9.4 does not support dropping enums on downgrade on autogen. So, -# ... we separate enum declarations from upgrade. -def drop_enums(enums: Iterator[sa.Enum]): - """ - Drop a list of enums - """ - for enum in enums: - enum.drop(op.get_bind(), checkfirst=True) - - -resource_type = sa.Enum( - "datasets", - "models", - "model_configurations", - "publications", - "simulations", - "workflows", - name="resourcetype", -) -extracted_type = sa.Enum("equation", "figure", "table", name="extractedtype") -taggable_type = sa.Enum( - "datasets", - "models", - "projects", - "publications", - "qualifiers", - "simulation_parameters", - "model_configurations", - "simulations", - "workflows", - name="taggabletype", -) -role = sa.Enum("author", "contributor", "maintainer", "other", name="role") -ontological_field = sa.Enum("obj", "unit", name="ontologicalfield") -relation_type = sa.Enum( - "BEGINS_AT", - "CITES", - "COMBINED_FROM", - "CONTAINS", - "COPIED_FROM", - "DECOMPOSED_FROM", - "DERIVED_FROM", - "EDITED_FROM", - "EQUIVALENT_OF", - "EXTRACTED_FROM", - "GENERATED_BY", - "GLUED_FROM", - "IS_CONCEPT_OF", - "PARAMETER_OF", - "REINTERPRETS", - "STRATIFIED_FROM", - "USES", - name="relationtype", -) -provenance_type = sa.Enum( - "Concept", - "Dataset", - "Model", - "ModelConfiguration", - "Project", - "Publication", - "Simulation", - name="provenancetype", -) -value_type = sa.Enum("binary", "bool", "float", "int", "str", name="valuetype") +now_text = os.getenv("SQL_NOW_STATEMENT", "now()") def upgrade() -> None: @@ -121,7 +68,10 @@ def upgrade() -> None: sa.Column("name", sa.String(), nullable=False), sa.Column("description", sa.String(), nullable=False), sa.Column( - "timestamp", sa.DateTime(), server_default=sa.text("now()"), nullable=True + "timestamp", + sa.DateTime(), + server_default=sa.text(f"{now_text}"), + nullable=True, ), sa.Column("active", sa.Boolean(), nullable=False), sa.Column("username", sa.String(), nullable=True), @@ -138,7 +88,10 @@ def upgrade() -> None: "software", sa.Column("id", sa.Integer(), nullable=False), sa.Column( - "timestamp", sa.DateTime(), server_default=sa.text("now()"), nullable=False + "timestamp", + sa.DateTime(), + server_default=sa.text(f"{now_text}"), + nullable=False, ), sa.Column("source", sa.String(), nullable=False), sa.Column("storage_uri", sa.String(), nullable=False), @@ -187,7 +140,10 @@ def upgrade() -> None: "model_runtime", sa.Column("id", sa.Integer(), nullable=False), sa.Column( - "timestamp", sa.DateTime(), server_default=sa.text("now()"), nullable=False + "timestamp", + sa.DateTime(), + server_default=sa.text(f"{now_text}"), + nullable=False, ), sa.Column("name", sa.String(), nullable=False), sa.Column("left", sa.String(), nullable=False), @@ -240,7 +196,10 @@ def upgrade() -> None: "provenance", sa.Column("id", sa.Integer(), nullable=False), sa.Column( - "timestamp", sa.DateTime(), server_default=sa.text("now()"), nullable=False + "timestamp", + sa.DateTime(), + server_default=sa.text(f"{now_text}"), + nullable=False, ), sa.Column( "relation_type", From 941d8f79a72bc95ffefa654d34bc9a05725f5ec7 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:37:17 -0700 Subject: [PATCH 076/140] Refactored model migration for testing. --- .../2e9a3d2ffe83_update_model_id_types.py | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/migrate/versions/2e9a3d2ffe83_update_model_id_types.py b/migrate/versions/2e9a3d2ffe83_update_model_id_types.py index d8f227eb3..f021b3a47 100644 --- a/migrate/versions/2e9a3d2ffe83_update_model_id_types.py +++ b/migrate/versions/2e9a3d2ffe83_update_model_id_types.py @@ -18,24 +18,24 @@ def upgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.alter_column( - "ontology_concept", - "object_id", - existing_type=sa.INTEGER(), - type_=sa.String(), - existing_nullable=False, - ) - # ### end Alembic commands ### + with op.batch_alter_table("ontology_concept") as batch_op: + # ### commands auto generated by Alembic - please adjust! ### + batch_op.alter_column( + "object_id", + existing_type=sa.INTEGER(), + type_=sa.String(), + existing_nullable=False, + ) + # ### end Alembic commands ### def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.alter_column( - "ontology_concept", - "object_id", - existing_type=sa.String(), - type_=sa.INTEGER(), - existing_nullable=False, - ) - # ### end Alembic commands ### + with op.batch_alter_table("ontology_concept") as batch_op: + # ### commands auto generated by Alembic - please adjust! ### + batch_op.alter_column( + "object_id", + existing_type=sa.String(), + type_=sa.INTEGER(), + existing_nullable=False, + ) + # ### end Alembic commands ### From e7e51ae674246ded1e613d742b6ae9b1db598d46 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:37:32 -0700 Subject: [PATCH 077/140] Refactored project asset migration for testing. --- ...80c_update_project_asset_with_string_id.py | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/migrate/versions/895deab7e80c_update_project_asset_with_string_id.py b/migrate/versions/895deab7e80c_update_project_asset_with_string_id.py index 032e5f391..02ed9dcc9 100644 --- a/migrate/versions/895deab7e80c_update_project_asset_with_string_id.py +++ b/migrate/versions/895deab7e80c_update_project_asset_with_string_id.py @@ -18,18 +18,18 @@ def upgrade() -> None: - op.alter_column( - table_name="project_asset", - column_name="resource_id", - nullable=False, - type_=sa.String(), - ) + with op.batch_alter_table("project_asset") as batch_op: + batch_op.alter_column( + column_name="resource_id", + nullable=False, + type_=sa.String(), + ) def downgrade() -> None: - op.alter_column( - table_name="project_asset", - column_name="resource_id", - nullable=False, - type_=sa.Integer(), - ) + with op.batch_alter_table("project_asset") as batch_op: + batch_op.alter_column( + column_name="resource_id", + nullable=False, + type_=sa.Integer(), + ) From ce1abef7231415bb945f9f5eddf27442779ca007 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:38:00 -0700 Subject: [PATCH 078/140] Refactored artifact enum migration for testing. --- .../1a3cf96fb50f_add_artifact_to_enums.py | 70 +++++++++++++++++-- 1 file changed, 66 insertions(+), 4 deletions(-) diff --git a/migrate/versions/1a3cf96fb50f_add_artifact_to_enums.py b/migrate/versions/1a3cf96fb50f_add_artifact_to_enums.py index 2ec115b17..25cb9ac5d 100644 --- a/migrate/versions/1a3cf96fb50f_add_artifact_to_enums.py +++ b/migrate/versions/1a3cf96fb50f_add_artifact_to_enums.py @@ -10,6 +10,13 @@ # pylint: disable=no-member, invalid-name from alembic import op +from migrate.scripts.enums import ( + provenance_type, + resource_type, + taggable_type, + update_enum, +) + # revision identifiers, used by Alembic. revision = "1a3cf96fb50f" down_revision = "895deab7e80c" @@ -18,10 +25,65 @@ def upgrade() -> None: - with op.get_context().autocommit_block(): - op.execute("ALTER TYPE public.resourcetype ADD VALUE 'artifacts'") - op.execute("ALTER TYPE public.taggabletype ADD VALUE 'artifacts'") - op.execute("ALTER TYPE public.provenancetype ADD VALUE 'Artifact'") + resource_enums = { + "association": "resource_type", + "project_asset": "resource_type", + } + resource_list = [ + "datasets", + "models", + "model_configurations", + "publications", + "simulations", + "workflows", + "artifacts", + ] + update_enum( + name="resourcetype", + enum_obj=resource_type, + cols=resource_enums, + enum_entities=resource_list, + ) + taggable_enums = { + "ontology_concept": "type", + } + taggable_list = [ + "datasets", + "models", + "projects", + "publications", + "qualifiers", + "simulation_parameters", + "model_configurations", + "simulations", + "workflows", + "artifacts", + ] + update_enum( + name="taggabletype", + enum_obj=taggable_type, + cols=taggable_enums, + enum_entities=taggable_list, + ) + provenance_enums = { + "provenance": ["left_type", "right_type"], + } + provenance_list = [ + "Concept", + "Dataset", + "Model", + "ModelConfiguration", + "Project", + "Publication", + "Simulation", + "Artifact", + ] + update_enum( + name="provenancetype", + enum_obj=provenance_type, + cols=provenance_enums, + enum_entities=provenance_list, + ) def downgrade() -> None: From b1e027352db441c2775496a1a39f4c84bc613854 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:38:17 -0700 Subject: [PATCH 079/140] Refactored publication migration for testing. --- migrate/versions/d6ec58f4fd9a_add_publication_metadata.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/migrate/versions/d6ec58f4fd9a_add_publication_metadata.py b/migrate/versions/d6ec58f4fd9a_add_publication_metadata.py index 2916e8b33..7e86f6134 100644 --- a/migrate/versions/d6ec58f4fd9a_add_publication_metadata.py +++ b/migrate/versions/d6ec58f4fd9a_add_publication_metadata.py @@ -18,8 +18,10 @@ def upgrade() -> None: - op.add_column("publication", sa.Column("publication_data", sa.JSON, nullable=True)) + with op.batch_alter_table("publication") as batch_op: + batch_op.add_column(sa.Column("publication_data", sa.JSON, nullable=True)) def downgrade() -> None: - op.drop_column("publication", "publication_data") + with op.batch_alter_table("publication") as batch_op: + batch_op.drop_column("publication", "publication_data") From fe013f747571b6f566921dea3534c03b651ab257 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:38:57 -0700 Subject: [PATCH 080/140] Added profiles to docker compose. --- docker-compose.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 0581732e0..79603a191 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,6 +8,7 @@ networks: name: data-annotation-stack services: rdb: + profiles: ["tds-api", "local"] container_name: data-service-rdb image: "postgres:15.1" ports: @@ -50,6 +51,7 @@ services: - $PWD/tds:/api/tds - $PWD/migrate:/api/migrate graphdb: + profiles: ["tds-api", "local"] build: context: ./ dockerfile: docker/Dockerfile.neo4j @@ -69,6 +71,7 @@ services: networks: - data-api minio: + profiles: ["local"] build: context: ./ dockerfile: docker/Dockerfile.minio @@ -84,6 +87,7 @@ services: - data-api - data-annotation-stack elasticsearch: + profiles: ["local", "tds-testing"] image: elasticsearch:${STACK_VERSION} environment: - discovery.type=single-node @@ -103,6 +107,7 @@ services: timeout: 20s retries: 5 kibana: + profiles: ["local"] depends_on: - elasticsearch image: docker.elastic.co/kibana/kibana:${STACK_VERSION} @@ -120,6 +125,7 @@ services: - data-api - data-annotation-stack migrations: + profiles: ["tds-api-only", "tds-api", "local"] container_name: data-service-migrations build: context: ./ From 76d873e03325861a4e7e1ddf72352ac8d607f2ec Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:40:29 -0700 Subject: [PATCH 081/140] Added test deps. --- pyproject.toml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 230215d27..97e54e7a7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,10 +1,9 @@ [tool.poetry] name = "tds" -version = "0.3.11" +version = "0.6.0" description = "The API that sits on top of the data store for the ASKEM program." authors = ["Five Grant "] -readme = "README.md" packages = [{include = "tds"}, {include="tests"}] license = "MIT" @@ -47,8 +46,8 @@ pytest-alembic = "^0.10.0" pytest-mock-resources = "^2.6.8" python-on-whales = "^0.59.0" moto = "^4.1.14" -pytest-elasticsearch = "^4.0.0" pytest-mock = "^3.11.1" +mock = "^5.1.0" [build-system] requires = ["poetry-core"] @@ -66,10 +65,9 @@ profile = "black" [tool.pytest.ini_options] addopts = "--ignore-glob=*utils.py" -testpaths = [ - "tests", -] +testpaths = ["tests"] filterwarnings = ["ignore::DeprecationWarning"] +pythonpath = ["."] [tool.pylint.master] # Since the data store is part of an R&D project, it makes sense to move fast From 5bc43fa3c70820a0320e5c8f083a23bc68c96b51 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:40:43 -0700 Subject: [PATCH 082/140] Updated poetry.lock file. --- poetry.lock | 2866 +++++++++++++++++++++++++++------------------------ 1 file changed, 1513 insertions(+), 1353 deletions(-) diff --git a/poetry.lock b/poetry.lock index 79eb71813..7dc53986e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,15 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + [[package]] name = "aiobotocore" version = "2.4.2" description = "Async client for aws services using botocore and aiohttp" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "aiobotocore-2.4.2-py3-none-any.whl", hash = "sha256:4acd1ebe2e44be4b100aa553910bda899f6dc090b3da2bc1cf3d5de2146ed208"}, + {file = "aiobotocore-2.4.2.tar.gz", hash = "sha256:0603b74a582dffa7511ce7548d07dc9b10ec87bc5fb657eb0b34f9bd490958bf"}, +] [package.dependencies] aiohttp = ">=3.3.1" @@ -18,11 +23,99 @@ boto3 = ["boto3 (>=1.24.59,<1.24.60)"] [[package]] name = "aiohttp" -version = "3.8.4" +version = "3.8.5" description = "Async http client/server framework (asyncio)" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, + {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, + {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, + {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, + {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, + {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, + {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, + {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, + {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, + {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, + {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, +] [package.dependencies] aiosignal = ">=1.1.2" @@ -40,17 +133,23 @@ speedups = ["Brotli", "aiodns", "cchardet"] name = "aioitertools" version = "0.11.0" description = "itertools and builtins for AsyncIO and mixed iterables" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "aioitertools-0.11.0-py3-none-any.whl", hash = "sha256:04b95e3dab25b449def24d7df809411c10e62aab0cbe31a50ca4e68748c43394"}, + {file = "aioitertools-0.11.0.tar.gz", hash = "sha256:42c68b8dd3a69c2bf7f2233bf7df4bb58b557bca5252ac02ed5187bbc67d6831"}, +] [[package]] name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] [package.dependencies] frozenlist = ">=1.1.0" @@ -59,9 +158,12 @@ frozenlist = ">=1.1.0" name = "alembic" version = "1.11.1" description = "A database migration tool for SQLAlchemy." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "alembic-1.11.1-py3-none-any.whl", hash = "sha256:dc871798a601fab38332e38d6ddb38d5e734f60034baeb8e2db5b642fccd8ab8"}, + {file = "alembic-1.11.1.tar.gz", hash = "sha256:6a810a6b012c88b33458fceb869aef09ac75d6ace5291915ba7fae44de372c01"}, +] [package.dependencies] Mako = "*" @@ -73,28 +175,35 @@ tz = ["python-dateutil"] [[package]] name = "anyio" -version = "3.6.2" +version = "3.7.1" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7" +files = [ + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, +] [package.dependencies] +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" [package.extras] -doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] -trio = ["trio (>=0.16,<0.22)"] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] [[package]] name = "astroid" -version = "2.15.5" +version = "2.15.6" description = "An abstract syntax tree for Python with inference support." -category = "dev" optional = false python-versions = ">=3.7.2" +files = [ + {file = "astroid-2.15.6-py3-none-any.whl", hash = "sha256:389656ca57b6108f939cf5d2f9a2a825a3be50ba9d589670f393236e0a03b91c"}, + {file = "astroid-2.15.6.tar.gz", hash = "sha256:903f024859b7c7687d7a7f3a3f73b17301f8e42dfd9cc9df9d4418172d3e2dbd"}, +] [package.dependencies] lazy-object-proxy = ">=1.4.0" @@ -108,17 +217,23 @@ wrapt = [ name = "async-timeout" version = "4.0.2" description = "Timeout context manager for asyncio programs" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] [[package]] name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] @@ -131,9 +246,22 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte name = "black" version = "22.12.0" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, + {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, + {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, + {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, + {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, + {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, + {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, + {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, + {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, + {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, + {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, + {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, +] [package.dependencies] click = ">=8.0.0" @@ -152,9 +280,12 @@ uvloop = ["uvloop (>=0.15.2)"] name = "boto3" version = "1.24.0" description = "The AWS SDK for Python" -category = "main" optional = false python-versions = ">= 3.7" +files = [ + {file = "boto3-1.24.0-py3-none-any.whl", hash = "sha256:a42900a0ea75600a76b371b03ac645461e4f3c97bb13ae5136bb4d3c87c6c110"}, + {file = "boto3-1.24.0.tar.gz", hash = "sha256:8df0215521969e229a6a004eedc6a484a3656611ddee698419d3658ae9c53c50"}, +] [package.dependencies] botocore = ">=1.27.0,<1.28.0" @@ -168,9 +299,12 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] name = "botocore" version = "1.27.59" description = "Low-level, data-driven core of boto 3." -category = "main" optional = false python-versions = ">= 3.7" +files = [ + {file = "botocore-1.27.59-py3-none-any.whl", hash = "sha256:69d756791fc024bda54f6c53f71ae34e695ee41bbbc1743d9179c4837a4929da"}, + {file = "botocore-1.27.59.tar.gz", hash = "sha256:eda4aed6ee719a745d1288eaf1beb12f6f6448ad1fa12f159405db14ba9c92cf"}, +] [package.dependencies] jmespath = ">=0.7.1,<2.0.0" @@ -182,35 +316,196 @@ crt = ["awscrt (==0.14.0)"] [[package]] name = "certifi" -version = "2023.5.7" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" [[package]] name = "cfgv" version = "3.3.1" description = "Validate configuration and produce human readable error messages." -category = "dev" optional = false python-versions = ">=3.6.1" +files = [ + {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, + {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, +] [[package]] name = "charset-normalizer" -version = "3.1.0" +version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] [[package]] name = "click" -version = "8.1.3" +version = "8.1.6" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, + {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -219,17 +514,68 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +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 = "cryptography" +version = "41.0.3" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507"}, + {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116"}, + {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c"}, + {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae"}, + {file = "cryptography-41.0.3-cp37-abi3-win32.whl", hash = "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306"}, + {file = "cryptography-41.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4"}, + {file = "cryptography-41.0.3.tar.gz", hash = "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34"}, +] + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] [[package]] name = "dbml-builder" version = "0.3.0" description = "Builds usable models from DBML" -category = "main" optional = false python-versions = ">=3.10,<4.0" +files = [ + {file = "dbml_builder-0.3.0-py3-none-any.whl", hash = "sha256:6c00d59a16047b63e5d6640d4bd6805189b425d33287e844f980ccd957d5de4a"}, + {file = "dbml_builder-0.3.0.tar.gz", hash = "sha256:98f79a347de6702335af86a0f2fd3101daad54b2110b8f5102d0e446a275543b"}, +] [package.dependencies] click = ">=8.1,<9.0" @@ -241,30 +587,39 @@ SQLAlchemy = ">=1.4.41,<2.0.0" [[package]] name = "dill" -version = "0.3.6" -description = "serialize all of python" -category = "dev" +version = "0.3.7" +description = "serialize all of Python" optional = false python-versions = ">=3.7" +files = [ + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, +] [package.extras] graph = ["objgraph (>=1.7.2)"] [[package]] name = "distlib" -version = "0.3.6" +version = "0.3.7" description = "Distribution utilities" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, + {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, +] [[package]] name = "elastic-transport" version = "8.4.0" description = "Transport classes and utilities shared among Python Elastic client libraries" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "elastic-transport-8.4.0.tar.gz", hash = "sha256:b9ad708ceb7fcdbc6b30a96f886609a109f042c0b9d9f2e44403b3133ba7ff10"}, + {file = "elastic_transport-8.4.0-py3-none-any.whl", hash = "sha256:19db271ab79c9f70f8c43f8f5b5111408781a6176b54ab2e54d713b6d9ceb815"}, +] [package.dependencies] certifi = "*" @@ -277,9 +632,12 @@ develop = ["aiohttp", "mock", "pytest", "pytest-asyncio", "pytest-cov", "pytest- name = "elasticsearch" version = "8.5.3" description = "Python client for Elasticsearch" -category = "main" optional = false python-versions = ">=3.6, <4" +files = [ + {file = "elasticsearch-8.5.3-py3-none-any.whl", hash = "sha256:f09adbea8caa633ff79e8fe115fb1d2b635426fe1a23e7e8e3bd7cce5ac3eb70"}, + {file = "elasticsearch-8.5.3.tar.gz", hash = "sha256:4b71ad05b36243c3b13f1c89b3ede4357011eece68917e293c43d4177d565838"}, +] [package.dependencies] aiohttp = {version = ">=3,<4", optional = true, markers = "extra == \"async\""} @@ -293,17 +651,23 @@ requests = ["requests (>=2.4.0,<3.0.0)"] name = "et-xmlfile" version = "1.1.0" description = "An implementation of lxml.xmlfile for the standard library" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, + {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, +] [[package]] name = "exceptiongroup" -version = "1.1.1" +version = "1.1.2" description = "Backport of PEP 654 (exception groups)" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, + {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, +] [package.extras] test = ["pytest (>=6)"] @@ -312,9 +676,12 @@ test = ["pytest (>=6)"] name = "fastapi" version = "0.85.2" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "fastapi-0.85.2-py3-none-any.whl", hash = "sha256:6292db0edd4a11f0d938d6033ccec5f706e9d476958bf33b119e8ddb4e524bde"}, + {file = "fastapi-0.85.2.tar.gz", hash = "sha256:3e10ea0992c700e0b17b6de8c2092d7b9cd763ce92c49ee8d4be10fee3b2f367"}, +] [package.dependencies] pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" @@ -328,31 +695,99 @@ test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==22.8.0)", "databases[sqlite] ( [[package]] name = "filelock" -version = "3.12.0" +version = "3.12.2" description = "A platform independent file lock." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, + {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, +] [package.extras] -docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] name = "frozenlist" -version = "1.3.3" +version = "1.4.0" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, + {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, + {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, + {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, + {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, + {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, + {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, + {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, + {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, + {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, +] [[package]] name = "fsspec" version = "2022.11.0" description = "File-system specification" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "fsspec-2022.11.0-py3-none-any.whl", hash = "sha256:d6e462003e3dcdcb8c7aa84c73a228f8227e72453cd22570e2363e8844edfe7b"}, + {file = "fsspec-2022.11.0.tar.gz", hash = "sha256:259d5fd5c8e756ff2ea72f42e7613c32667dc2049a4ac3d84364a7ca034acb8b"}, +] [package.extras] abfs = ["adlfs"] @@ -381,17 +816,81 @@ tqdm = ["tqdm"] name = "funcy" version = "1.18" description = "A fancy and practical functional tools" -category = "main" optional = false python-versions = "*" +files = [ + {file = "funcy-1.18-py2.py3-none-any.whl", hash = "sha256:00ce91afc850357a131dc54f0db2ad8a1110d5087f1fa4480d7ea3ba0249f89d"}, + {file = "funcy-1.18.tar.gz", hash = "sha256:15448d19a8ebcc7a585afe7a384a19186d0bd67cbf56fb42cd1fd0f76313f9b2"}, +] [[package]] name = "greenlet" version = "2.0.2" description = "Lightweight in-process concurrent programming" -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] [package.extras] docs = ["Sphinx", "docutils (<0.18)"] @@ -401,17 +900,23 @@ test = ["objgraph", "psutil"] name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] [[package]] name = "identify" -version = "2.5.24" +version = "2.5.26" description = "File identification library for Python" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "identify-2.5.26-py2.py3-none-any.whl", hash = "sha256:c22a8ead0d4ca11f1edd6c9418c3220669b3b7533ada0a0ffa6cc0ef85cf9b54"}, + {file = "identify-2.5.26.tar.gz", hash = "sha256:7243800bce2f58404ed41b7c002e53d4d22bcf3ae1b7900c2d7aefd95394bf7f"}, +] [package.extras] license = ["ukkonen"] @@ -420,25 +925,34 @@ license = ["ukkonen"] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] [[package]] name = "isort" version = "5.12.0" description = "A Python utility / library to sort Python imports." -category = "dev" optional = false python-versions = ">=3.8.0" +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] [package.extras] colors = ["colorama (>=0.4.3)"] @@ -450,9 +964,12 @@ requirements-deprecated-finder = ["pip-api", "pipreqs"] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -464,25 +981,68 @@ i18n = ["Babel (>=2.7)"] name = "jmespath" version = "1.0.1" description = "JSON Matching Expressions" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] [[package]] name = "lazy-object-proxy" version = "1.9.0" description = "A fast and thorough lazy object proxy." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, +] [[package]] name = "mako" version = "1.2.4" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, + {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, +] [package.dependencies] MarkupSafe = ">=0.9.2" @@ -494,89 +1054,321 @@ testing = ["pytest"] [[package]] name = "markupsafe" -version = "2.1.2" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] [[package]] name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] [[package]] name = "minio" version = "7.1.15" description = "MinIO Python SDK for Amazon S3 Compatible Cloud Storage" -category = "main" optional = false python-versions = "*" +files = [ + {file = "minio-7.1.15-py3-none-any.whl", hash = "sha256:1afdf01c1bc8b57ddd12d438e3e168d625465b56f4d1c2af7576744c688e84c6"}, + {file = "minio-7.1.15.tar.gz", hash = "sha256:fcf8ac2cef310d5ddff2bef2c42f4e5a8bb546b87bca5bf8832135db054ca4e1"}, +] [package.dependencies] certifi = "*" urllib3 = "*" [[package]] -name = "multidict" -version = "6.0.4" -description = "multidict implementation" -category = "main" +name = "mock" +version = "5.1.0" +description = "Rolling backport of unittest.mock for all Pythons" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" +files = [ + {file = "mock-5.1.0-py3-none-any.whl", hash = "sha256:18c694e5ae8a208cdb3d2c20a993ca1a7b0efa258c247a1e565150f477f83744"}, + {file = "mock-5.1.0.tar.gz", hash = "sha256:5e96aad5ccda4718e0a229ed94b2024df75cc2d55575ba5762d31f5767b8767d"}, +] -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" -optional = false -python-versions = ">=3.5" +[package.extras] +build = ["blurb", "twine", "wheel"] +docs = ["sphinx"] +test = ["pytest", "pytest-cov"] [[package]] -name = "neo4j" -version = "5.8.1" -description = "Neo4j Bolt driver for Python" -category = "main" +name = "moto" +version = "4.1.14" +description = "" optional = false python-versions = ">=3.7" +files = [ + {file = "moto-4.1.14-py2.py3-none-any.whl", hash = "sha256:7d3bd748a34641715ba469c761f72fb8ec18f349987c98f5a0f9be85a07a9911"}, + {file = "moto-4.1.14.tar.gz", hash = "sha256:545afeb4df94dfa730e2d7e87366dc26b4a33c2891f462cbb049f040c80ed1ec"}, +] [package.dependencies] -pytz = "*" +boto3 = ">=1.9.201" +botocore = ">=1.12.201" +cryptography = ">=3.3.1" +Jinja2 = ">=2.10.1" +python-dateutil = ">=2.1,<3.0.0" +requests = ">=2.5" +responses = ">=0.13.0" +werkzeug = ">=0.5,<2.2.0 || >2.2.0,<2.2.1 || >2.2.1" +xmltodict = "*" [package.extras] -numpy = ["numpy (>=1.7.0,<2.0.0)"] -pandas = ["numpy (>=1.7.0,<2.0.0)", "pandas (>=1.1.0,<3.0.0)"] +all = ["PyYAML (>=5.1)", "aws-xray-sdk (>=0.93,!=0.96)", "cfn-lint (>=0.40.0)", "docker (>=3.0.0)", "ecdsa (!=0.15)", "graphql-core", "jsondiff (>=1.1.2)", "openapi-spec-validator (>=0.2.8)", "py-partiql-parser (==0.3.6)", "pyparsing (>=3.0.7)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "setuptools", "sshpubkeys (>=3.1.0)"] +apigateway = ["PyYAML (>=5.1)", "ecdsa (!=0.15)", "openapi-spec-validator (>=0.2.8)", "python-jose[cryptography] (>=3.1.0,<4.0.0)"] +apigatewayv2 = ["PyYAML (>=5.1)"] +appsync = ["graphql-core"] +awslambda = ["docker (>=3.0.0)"] +batch = ["docker (>=3.0.0)"] +cloudformation = ["PyYAML (>=5.1)", "aws-xray-sdk (>=0.93,!=0.96)", "cfn-lint (>=0.40.0)", "docker (>=3.0.0)", "ecdsa (!=0.15)", "graphql-core", "jsondiff (>=1.1.2)", "openapi-spec-validator (>=0.2.8)", "py-partiql-parser (==0.3.6)", "pyparsing (>=3.0.7)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "setuptools", "sshpubkeys (>=3.1.0)"] +cognitoidp = ["ecdsa (!=0.15)", "python-jose[cryptography] (>=3.1.0,<4.0.0)"] +ds = ["sshpubkeys (>=3.1.0)"] +dynamodb = ["docker (>=3.0.0)", "py-partiql-parser (==0.3.6)"] +dynamodbstreams = ["docker (>=3.0.0)", "py-partiql-parser (==0.3.6)"] +ebs = ["sshpubkeys (>=3.1.0)"] +ec2 = ["sshpubkeys (>=3.1.0)"] +efs = ["sshpubkeys (>=3.1.0)"] +eks = ["sshpubkeys (>=3.1.0)"] +glue = ["pyparsing (>=3.0.7)"] +iotdata = ["jsondiff (>=1.1.2)"] +route53resolver = ["sshpubkeys (>=3.1.0)"] +s3 = ["PyYAML (>=5.1)", "py-partiql-parser (==0.3.6)"] +s3crc32c = ["PyYAML (>=5.1)", "crc32c", "py-partiql-parser (==0.3.6)"] +server = ["PyYAML (>=5.1)", "aws-xray-sdk (>=0.93,!=0.96)", "cfn-lint (>=0.40.0)", "docker (>=3.0.0)", "ecdsa (!=0.15)", "flask (!=2.2.0,!=2.2.1)", "flask-cors", "graphql-core", "jsondiff (>=1.1.2)", "openapi-spec-validator (>=0.2.8)", "py-partiql-parser (==0.3.6)", "pyparsing (>=3.0.7)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "setuptools", "sshpubkeys (>=3.1.0)"] +ssm = ["PyYAML (>=5.1)"] +xray = ["aws-xray-sdk (>=0.93,!=0.96)", "setuptools"] [[package]] -name = "nodeenv" -version = "1.8.0" -description = "Node.js virtual environment builder" -category = "dev" +name = "multidict" +version = "6.0.4" +description = "multidict implementation" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" - -[package.dependencies] -setuptools = "*" - -[[package]] +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "neo4j" +version = "5.11.0" +description = "Neo4j Bolt driver for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "neo4j-5.11.0.tar.gz", hash = "sha256:81d425ef9a53279c6909ec8d33e7dc913acc840292f0f3a047f3c3c5b74bccb5"}, +] + +[package.dependencies] +pytz = "*" + +[package.extras] +numpy = ["numpy (>=1.7.0,<2.0.0)"] +pandas = ["numpy (>=1.7.0,<2.0.0)", "pandas (>=1.1.0,<3.0.0)"] + +[[package]] +name = "nodeenv" +version = "1.8.0" +description = "Node.js virtual environment builder" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] name = "numpy" -version = "1.24.3" +version = "1.25.2" description = "Fundamental package for array computing in Python" -category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +files = [ + {file = "numpy-1.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3"}, + {file = "numpy-1.25.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f"}, + {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187"}, + {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357"}, + {file = "numpy-1.25.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9"}, + {file = "numpy-1.25.2-cp310-cp310-win32.whl", hash = "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044"}, + {file = "numpy-1.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545"}, + {file = "numpy-1.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418"}, + {file = "numpy-1.25.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f"}, + {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2"}, + {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf"}, + {file = "numpy-1.25.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364"}, + {file = "numpy-1.25.2-cp311-cp311-win32.whl", hash = "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d"}, + {file = "numpy-1.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4"}, + {file = "numpy-1.25.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3"}, + {file = "numpy-1.25.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926"}, + {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca"}, + {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295"}, + {file = "numpy-1.25.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f"}, + {file = "numpy-1.25.2-cp39-cp39-win32.whl", hash = "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01"}, + {file = "numpy-1.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf"}, + {file = "numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760"}, +] [[package]] name = "omymodels" version = "0.12.1" description = "O! My Models (omymodels) is a library to generate Python Models for SQLAlchemy (ORM & Core), GinoORM, Pydantic, Pydal tables & Python Dataclasses from SQL DDL. And convert one models to another." -category = "main" optional = false python-versions = ">=3.6.2,<4.0" +files = [ + {file = "omymodels-0.12.1-py3-none-any.whl", hash = "sha256:854c6013de03d665fae6809f6acc9bec998ac173282afae45fad1737f971e53b"}, + {file = "omymodels-0.12.1.tar.gz", hash = "sha256:dd9a6ad27c11fe4f7cc37a8eccbafd0e00cc1ed4757e6fe342bfe14fd599ccff"}, +] [package.dependencies] Jinja2 = ">=3.0.1,<4.0.0" @@ -589,9 +1381,11 @@ table-meta = ">=0.1.5,<0.2.0" name = "openai" version = "0.25.0" description = "Python client library for the OpenAI API" -category = "main" optional = false python-versions = ">=3.7.1" +files = [ + {file = "openai-0.25.0.tar.gz", hash = "sha256:59ac6531e4f7bf8e9a53186e853d9ffb1d5f07973ecb4f7d273163a314814510"}, +] [package.dependencies] numpy = "*" @@ -603,7 +1397,7 @@ tqdm = "*" typing_extensions = "*" [package.extras] -dev = ["black (>=21.6b0,<22.0)", "pytest (>=6.0.0,<7.0.0)"] +dev = ["black (>=21.6b0,<22.0)", "pytest (==6.*)"] embeddings = ["matplotlib", "plotly", "scikit-learn (>=1.0.2)", "sklearn", "tenacity (>=8.0.1)"] wandb = ["wandb"] @@ -611,9 +1405,12 @@ wandb = ["wandb"] name = "openpyxl" version = "3.1.2" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "openpyxl-3.1.2-py2.py3-none-any.whl", hash = "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5"}, + {file = "openpyxl-3.1.2.tar.gz", hash = "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184"}, +] [package.dependencies] et-xmlfile = "*" @@ -622,17 +1419,48 @@ et-xmlfile = "*" name = "packaging" version = "23.1" description = "Core utilities for Python packages" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] [[package]] name = "pandas" version = "1.5.3" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, + {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, + {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, + {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, + {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, + {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, + {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, + {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, +] [package.dependencies] numpy = [ @@ -647,53 +1475,68 @@ test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] [[package]] name = "pandas-stubs" -version = "2.0.1.230501" +version = "2.0.2.230605" description = "Type annotations for pandas" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "pandas_stubs-2.0.2.230605-py3-none-any.whl", hash = "sha256:39106b602f3cb6dc5f728b84e1b32bde6ecf41ee34ee714c66228009609fbada"}, + {file = "pandas_stubs-2.0.2.230605.tar.gz", hash = "sha256:624c7bb06d38145a44b61be459ccd19b038e0bf20364a025ecaab78fea65e858"}, +] [package.dependencies] +numpy = ">=1.24.3" types-pytz = ">=2022.1.1" [[package]] name = "parsimonious" version = "0.8.1" description = "(Soon to be) the fastest pure-Python PEG parser I could muster" -category = "main" optional = false python-versions = "*" +files = [ + {file = "parsimonious-0.8.1.tar.gz", hash = "sha256:3add338892d580e0cb3b1a39e4a1b427ff9f687858fdd61097053742391a9f6b"}, +] [package.dependencies] six = ">=1.9.0" [[package]] name = "pathspec" -version = "0.11.1" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] [[package]] name = "platformdirs" -version = "3.5.1" +version = "3.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, +] [package.extras] -docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.2.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" -version = "1.0.0" +version = "1.2.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] [package.extras] dev = ["pre-commit", "tox"] @@ -703,17 +1546,23 @@ testing = ["pytest", "pytest-benchmark"] name = "ply" version = "3.11" description = "Python Lex & Yacc" -category = "main" optional = false python-versions = "*" +files = [ + {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, + {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, +] [[package]] name = "pre-commit" -version = "3.3.2" +version = "3.3.3" description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" optional = false python-versions = ">=3.8" +files = [ + {file = "pre_commit-3.3.3-py2.py3-none-any.whl", hash = "sha256:10badb65d6a38caff29703362271d7dca483d01da88f9d7e05d0b97171c136cb"}, + {file = "pre_commit-3.3.3.tar.gz", hash = "sha256:a2256f489cd913d575c145132ae196fe335da32d91a8294b7afe6622335dd023"}, +] [package.dependencies] cfgv = ">=2.0.0" @@ -726,17 +1575,34 @@ virtualenv = ">=20.10.0" name = "psycopg2" version = "2.9.6" description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "psycopg2-2.9.6-cp310-cp310-win32.whl", hash = "sha256:f7a7a5ee78ba7dc74265ba69e010ae89dae635eea0e97b055fb641a01a31d2b1"}, + {file = "psycopg2-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:f75001a1cbbe523e00b0ef896a5a1ada2da93ccd752b7636db5a99bc57c44494"}, + {file = "psycopg2-2.9.6-cp311-cp311-win32.whl", hash = "sha256:53f4ad0a3988f983e9b49a5d9765d663bbe84f508ed655affdb810af9d0972ad"}, + {file = "psycopg2-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b81fcb9ecfc584f661b71c889edeae70bae30d3ef74fa0ca388ecda50b1222b7"}, + {file = "psycopg2-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:11aca705ec888e4f4cea97289a0bf0f22a067a32614f6ef64fcf7b8bfbc53744"}, + {file = "psycopg2-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:36c941a767341d11549c0fbdbb2bf5be2eda4caf87f65dfcd7d146828bd27f39"}, + {file = "psycopg2-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:869776630c04f335d4124f120b7fb377fe44b0a7645ab3c34b4ba42516951889"}, + {file = "psycopg2-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:a8ad4a47f42aa6aec8d061fdae21eaed8d864d4bb0f0cade5ad32ca16fcd6258"}, + {file = "psycopg2-2.9.6-cp38-cp38-win32.whl", hash = "sha256:2362ee4d07ac85ff0ad93e22c693d0f37ff63e28f0615a16b6635a645f4b9214"}, + {file = "psycopg2-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:d24ead3716a7d093b90b27b3d73459fe8cd90fd7065cf43b3c40966221d8c394"}, + {file = "psycopg2-2.9.6-cp39-cp39-win32.whl", hash = "sha256:1861a53a6a0fd248e42ea37c957d36950da00266378746588eab4f4b5649e95f"}, + {file = "psycopg2-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:ded2faa2e6dfb430af7713d87ab4abbfc764d8d7fb73eafe96a24155f906ebf5"}, + {file = "psycopg2-2.9.6.tar.gz", hash = "sha256:f15158418fd826831b28585e2ab48ed8df2d0d98f502a2b4fe619e7d5ca29011"}, +] [[package]] name = "py-models-parser" version = "0.6.0" description = "Parser for Different Python Models (Pydantic, Enums, ORMs: Tortoise, SqlAlchemy, GinoORM, PonyORM, Pydal tables) to extract information about columns(attrs), model, table args,etc in one format." -category = "main" optional = false python-versions = ">=3.6,<4.0" +files = [ + {file = "py-models-parser-0.6.0.tar.gz", hash = "sha256:3dffed9ee79c9d7d62de1dfd939122bc6c48fc314c839c79d94d835f0d2633ae"}, + {file = "py_models_parser-0.6.0-py3-none-any.whl", hash = "sha256:0b6d0996ad56aa3fa98fe8ec2be74980e444959be84413ce855362f1573b8dfb"}, +] [package.dependencies] parsimonious = ">=0.8.1,<0.9.0" @@ -745,20 +1611,94 @@ parsimonious = ">=0.8.1,<0.9.0" name = "pyarrow" version = "10.0.1" description = "Python library for Apache Arrow" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pyarrow-10.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:e00174764a8b4e9d8d5909b6d19ee0c217a6cf0232c5682e31fdfbd5a9f0ae52"}, + {file = "pyarrow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f7a7dbe2f7f65ac1d0bd3163f756deb478a9e9afc2269557ed75b1b25ab3610"}, + {file = "pyarrow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb627673cb98708ef00864e2e243f51ba7b4c1b9f07a1d821f98043eccd3f585"}, + {file = "pyarrow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba71e6fc348c92477586424566110d332f60d9a35cb85278f42e3473bc1373da"}, + {file = "pyarrow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b4ede715c004b6fc535de63ef79fa29740b4080639a5ff1ea9ca84e9282f349"}, + {file = "pyarrow-10.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:e3fe5049d2e9ca661d8e43fab6ad5a4c571af12d20a57dffc392a014caebef65"}, + {file = "pyarrow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:254017ca43c45c5098b7f2a00e995e1f8346b0fb0be225f042838323bb55283c"}, + {file = "pyarrow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70acca1ece4322705652f48db65145b5028f2c01c7e426c5d16a30ba5d739c24"}, + {file = "pyarrow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abb57334f2c57979a49b7be2792c31c23430ca02d24becd0b511cbe7b6b08649"}, + {file = "pyarrow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:1765a18205eb1e02ccdedb66049b0ec148c2a0cb52ed1fb3aac322dfc086a6ee"}, + {file = "pyarrow-10.0.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:61f4c37d82fe00d855d0ab522c685262bdeafd3fbcb5fe596fe15025fbc7341b"}, + {file = "pyarrow-10.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e141a65705ac98fa52a9113fe574fdaf87fe0316cde2dffe6b94841d3c61544c"}, + {file = "pyarrow-10.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf26f809926a9d74e02d76593026f0aaeac48a65b64f1bb17eed9964bfe7ae1a"}, + {file = "pyarrow-10.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:443eb9409b0cf78df10ced326490e1a300205a458fbeb0767b6b31ab3ebae6b2"}, + {file = "pyarrow-10.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:f2d00aa481becf57098e85d99e34a25dba5a9ade2f44eb0b7d80c80f2984fc03"}, + {file = "pyarrow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b1fc226d28c7783b52a84d03a66573d5a22e63f8a24b841d5fc68caeed6784d4"}, + {file = "pyarrow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efa59933b20183c1c13efc34bd91efc6b2997377c4c6ad9272da92d224e3beb1"}, + {file = "pyarrow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:668e00e3b19f183394388a687d29c443eb000fb3fe25599c9b4762a0afd37775"}, + {file = "pyarrow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1bc6e4d5d6f69e0861d5d7f6cf4d061cf1069cb9d490040129877acf16d4c2a"}, + {file = "pyarrow-10.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:42ba7c5347ce665338f2bc64685d74855900200dac81a972d49fe127e8132f75"}, + {file = "pyarrow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b069602eb1fc09f1adec0a7bdd7897f4d25575611dfa43543c8b8a75d99d6874"}, + {file = "pyarrow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94fb4a0c12a2ac1ed8e7e2aa52aade833772cf2d3de9dde685401b22cec30002"}, + {file = "pyarrow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db0c5986bf0808927f49640582d2032a07aa49828f14e51f362075f03747d198"}, + {file = "pyarrow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:0ec7587d759153f452d5263dbc8b1af318c4609b607be2bd5127dcda6708cdb1"}, + {file = "pyarrow-10.0.1.tar.gz", hash = "sha256:1a14f57a5f472ce8234f2964cd5184cccaa8df7e04568c64edc33b23eb285dd5"}, +] [package.dependencies] numpy = ">=1.16.6" +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + [[package]] name = "pydantic" -version = "1.10.8" +version = "1.10.12" description = "Data validation and settings management using python type hints" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718"}, + {file = "pydantic-1.10.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe"}, + {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b"}, + {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d"}, + {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09"}, + {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed"}, + {file = "pydantic-1.10.12-cp310-cp310-win_amd64.whl", hash = "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a"}, + {file = "pydantic-1.10.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc"}, + {file = "pydantic-1.10.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405"}, + {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62"}, + {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494"}, + {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246"}, + {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33"}, + {file = "pydantic-1.10.12-cp311-cp311-win_amd64.whl", hash = "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f"}, + {file = "pydantic-1.10.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a"}, + {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565"}, + {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350"}, + {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303"}, + {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5"}, + {file = "pydantic-1.10.12-cp37-cp37m-win_amd64.whl", hash = "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8"}, + {file = "pydantic-1.10.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62"}, + {file = "pydantic-1.10.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb"}, + {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0"}, + {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c"}, + {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d"}, + {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33"}, + {file = "pydantic-1.10.12-cp38-cp38-win_amd64.whl", hash = "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47"}, + {file = "pydantic-1.10.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6"}, + {file = "pydantic-1.10.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523"}, + {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86"}, + {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1"}, + {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe"}, + {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb"}, + {file = "pydantic-1.10.12-cp39-cp39-win_amd64.whl", hash = "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d"}, + {file = "pydantic-1.10.12-py3-none-any.whl", hash = "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942"}, + {file = "pydantic-1.10.12.tar.gz", hash = "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303"}, +] [package.dependencies] typing-extensions = ">=4.2.0" @@ -771,23 +1711,29 @@ email = ["email-validator (>=1.0.3)"] name = "pydbml" version = "1.0.9" description = "Python parser and builder for DBML" -category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "pydbml-1.0.9-py3-none-any.whl", hash = "sha256:daf980325a7dd8b8d4d1ddc9814b80bc3f45d76d5b5c7a996154b6681e505b60"}, + {file = "pydbml-1.0.9.tar.gz", hash = "sha256:2017750418721d505bfc67daf024c5e4ef4126dff708264566ef1be2d18fef2f"}, +] [package.dependencies] pyparsing = ">=3.0.0" [[package]] name = "pylint" -version = "2.17.4" +version = "2.17.5" description = "python code static checker" -category = "dev" optional = false python-versions = ">=3.7.2" +files = [ + {file = "pylint-2.17.5-py3-none-any.whl", hash = "sha256:73995fb8216d3bed149c8d51bba25b2c52a8251a2c8ac846ec668ce38fab5413"}, + {file = "pylint-2.17.5.tar.gz", hash = "sha256:f7b601cbc06fef7e62a754e2b41294c2aa31f1cb659624b9a85bcba29eaf8252"}, +] [package.dependencies] -astroid = ">=2.15.4,<=2.17.0-dev0" +astroid = ">=2.15.6,<=2.17.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, @@ -805,22 +1751,28 @@ testutils = ["gitpython (>3)"] [[package]] name = "pyparsing" -version = "3.0.9" +version = "3.1.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "main" optional = false python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, +] [package.extras] diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.3.1" +version = "7.4.0" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} @@ -831,32 +1783,56 @@ pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-alembic" -version = "0.10.5" +version = "0.10.7" description = "A pytest plugin for verifying alembic migrations." -category = "dev" optional = false python-versions = ">=3.6,<4" +files = [ + {file = "pytest_alembic-0.10.7-py3-none-any.whl", hash = "sha256:69b7d756c26c07060734c9c346e2250f58f78ba5e6cdf4d8a5d2558a551c6348"}, + {file = "pytest_alembic-0.10.7.tar.gz", hash = "sha256:19d256424684d6c83e31b2410b73f1a435799396241b155d54aa103836e4640f"}, +] [package.dependencies] alembic = "*" pytest = ">=6.0" sqlalchemy = "*" +[[package]] +name = "pytest-mock" +version = "3.11.1" +description = "Thin-wrapper around the mock package for easier use with pytest" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-mock-3.11.1.tar.gz", hash = "sha256:7f6b125602ac6d743e523ae0bfa71e1a697a2f5534064528c6ff84c2f7c2fc7f"}, + {file = "pytest_mock-3.11.1-py3-none-any.whl", hash = "sha256:21c279fff83d70763b05f8874cc9cfb3fcacd6d354247a976f9529d19f9acf39"}, +] + +[package.dependencies] +pytest = ">=5.0" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + [[package]] name = "pytest-mock-resources" -version = "2.6.13" +version = "2.9.1" description = "A pytest plugin for easily instantiating reproducible mock resources." -category = "dev" optional = false python-versions = ">=3.7,<4" +files = [ + {file = "pytest_mock_resources-2.9.1-py3-none-any.whl", hash = "sha256:707bbe5552a29ec01dc6811d8e6a5c741dda29dfd2cefb3904fa75f04a32ebb5"}, + {file = "pytest_mock_resources-2.9.1.tar.gz", hash = "sha256:dc3448dead0a87d02e13f85f1ac16ff50f7406196fdf95b8b1a61f68b0981ad6"}, +] [package.dependencies] pytest = ">=1.0" sqlalchemy = ">1.0,<1.4.0 || >1.4.0,<1.4.1 || >1.4.1,<1.4.2 || >1.4.2,<1.4.3 || >1.4.3,<1.4.4 || >1.4.4,<1.4.5 || >1.4.5,<1.4.6 || >1.4.6,<1.4.7 || >1.4.7,<1.4.8 || >1.4.8,<1.4.9 || >1.4.9,<1.4.10 || >1.4.10,<1.4.11 || >1.4.11,<1.4.12 || >1.4.12,<1.4.13 || >1.4.13,<1.4.14 || >1.4.14,<1.4.15 || >1.4.15,<1.4.16 || >1.4.16,<1.4.17 || >1.4.17,<1.4.18 || >1.4.18,<1.4.19 || >1.4.19,<1.4.20 || >1.4.20,<1.4.21 || >1.4.21,<1.4.22 || >1.4.22,<1.4.23 || >1.4.23" +typing_extensions = "*" [package.extras] docker = ["filelock", "python-on-whales (>=0.22.0)"] @@ -873,9 +1849,12 @@ redshift = ["boto3", "filelock", "moto", "python-on-whales (>=0.22.0)", "sqlpars name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] [package.dependencies] six = ">=1.5" @@ -884,9 +1863,11 @@ six = ">=1.5" name = "python-multipart" version = "0.0.5" description = "A streaming multipart parser for Python" -category = "main" optional = false python-versions = "*" +files = [ + {file = "python-multipart-0.0.5.tar.gz", hash = "sha256:f7bb5f611fc600d15fa47b3974c8aa16e93724513b49b5f95c81e6624c83fa43"}, +] [package.dependencies] six = ">=1.4.0" @@ -895,9 +1876,12 @@ six = ">=1.4.0" name = "python-on-whales" version = "0.59.0" description = "A Docker client for Python, designed to be fun and intuitive!" -category = "dev" optional = false python-versions = ">=3.7, <4" +files = [ + {file = "python-on-whales-0.59.0.tar.gz", hash = "sha256:d60c9c7c723a69a8d22038a4bede44e93b08ab2fbdbfec4e62cf3508c4f6501c"}, + {file = "python_on_whales-0.59.0-py3-none-any.whl", hash = "sha256:0aaf447e78190f9085e2aa9dae6866d5038a4f6ac63a16d389f12df26e2ffcf4"}, +] [package.dependencies] pydantic = ">=1.5" @@ -910,25 +1894,72 @@ typing-extensions = "*" name = "pytz" version = "2023.3" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" +files = [ + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, +] [[package]] name = "pyyaml" -version = "6.0" +version = "6.0.1" description = "YAML parser and emitter for Python" -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] [[package]] name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] [package.dependencies] certifi = ">=2017.4.17" @@ -941,12 +1972,35 @@ socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] -name = "s3fs" -version = "2022.11.0" -description = "Convenient Filesystem interface over S3" -category = "main" +name = "responses" +version = "0.23.3" +description = "A utility library for mocking out the `requests` Python library." optional = false -python-versions = ">= 3.7" +python-versions = ">=3.7" +files = [ + {file = "responses-0.23.3-py3-none-any.whl", hash = "sha256:e6fbcf5d82172fecc0aa1860fd91e58cbfd96cee5e96da5b63fa6eb3caa10dd3"}, + {file = "responses-0.23.3.tar.gz", hash = "sha256:205029e1cb334c21cb4ec64fc7599be48b859a0fd381a42443cdd600bfe8b16a"}, +] + +[package.dependencies] +pyyaml = "*" +requests = ">=2.30.0,<3.0" +types-PyYAML = "*" +urllib3 = ">=1.25.10,<3.0" + +[package.extras] +tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli", "tomli-w", "types-requests"] + +[[package]] +name = "s3fs" +version = "2022.11.0" +description = "Convenient Filesystem interface over S3" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "s3fs-2022.11.0-py3-none-any.whl", hash = "sha256:42d57a3ceedb478b18ee53e34bbe3305a3f07f6381ca1ab76135efe076c6a07d"}, + {file = "s3fs-2022.11.0.tar.gz", hash = "sha256:10c5ac283a4f5b67ffad6d1f25ff7ee026142750c5c5dc868746cd904f617c33"}, +] [package.dependencies] aiobotocore = ">=2.4.0,<2.5.0" @@ -961,9 +2015,12 @@ boto3 = ["aiobotocore[boto3] (>=2.4.0,<2.5.0)"] name = "s3transfer" version = "0.6.1" description = "An Amazon S3 Transfer Manager" -category = "main" optional = false python-versions = ">= 3.7" +files = [ + {file = "s3transfer-0.6.1-py3-none-any.whl", hash = "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346"}, + {file = "s3transfer-0.6.1.tar.gz", hash = "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9"}, +] [package.dependencies] botocore = ">=1.12.36,<2.0a.0" @@ -973,11 +2030,14 @@ crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] [[package]] name = "setuptools" -version = "67.8.0" +version = "68.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, +] [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] @@ -988,9 +2048,12 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs ( name = "simple-ddl-parser" version = "0.27.0" description = "Simple DDL Parser to parse SQL & dialects like HQL, TSQL (MSSQL), Oracle, AWS Redshift, Snowflake, MySQL, PostgreSQL, etc ddl files to json/python dict with full information about columns: types, defaults, primary keys, etc.; sequences, alters, custom types & other entities from ddl." -category = "main" optional = false python-versions = ">=3.6,<4.0" +files = [ + {file = "simple-ddl-parser-0.27.0.tar.gz", hash = "sha256:1db574307022f14081aba245cb36c0e702ac31232f783e910b727df4c7de2929"}, + {file = "simple_ddl_parser-0.27.0-py3-none-any.whl", hash = "sha256:e8692480e45195bf04ba00d3043d333e27dd745b6c9daf00af1041e64735691e"}, +] [package.dependencies] ply = ">=3.11,<4.0" @@ -999,32 +2062,77 @@ ply = ">=3.11,<4.0" name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] [[package]] name = "sqlalchemy" -version = "1.4.48" +version = "1.4.49" description = "Database Abstraction Library" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "SQLAlchemy-1.4.49-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e126cf98b7fd38f1e33c64484406b78e937b1a280e078ef558b95bf5b6895f6"}, + {file = "SQLAlchemy-1.4.49-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:03db81b89fe7ef3857b4a00b63dedd632d6183d4ea5a31c5d8a92e000a41fc71"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:95b9df9afd680b7a3b13b38adf6e3a38995da5e162cc7524ef08e3be4e5ed3e1"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a63e43bf3f668c11bb0444ce6e809c1227b8f067ca1068898f3008a273f52b09"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f835c050ebaa4e48b18403bed2c0fda986525896efd76c245bdd4db995e51a4c"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c21b172dfb22e0db303ff6419451f0cac891d2e911bb9fbf8003d717f1bcf91"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-win32.whl", hash = "sha256:5fb1ebdfc8373b5a291485757bd6431de8d7ed42c27439f543c81f6c8febd729"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-win_amd64.whl", hash = "sha256:f8a65990c9c490f4651b5c02abccc9f113a7f56fa482031ac8cb88b70bc8ccaa"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8923dfdf24d5aa8a3adb59723f54118dd4fe62cf59ed0d0d65d940579c1170a4"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9ab2c507a7a439f13ca4499db6d3f50423d1d65dc9b5ed897e70941d9e135b0"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5debe7d49b8acf1f3035317e63d9ec8d5e4d904c6e75a2a9246a119f5f2fdf3d"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-win32.whl", hash = "sha256:82b08e82da3756765c2e75f327b9bf6b0f043c9c3925fb95fb51e1567fa4ee87"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-win_amd64.whl", hash = "sha256:171e04eeb5d1c0d96a544caf982621a1711d078dbc5c96f11d6469169bd003f1"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:36e58f8c4fe43984384e3fbe6341ac99b6b4e083de2fe838f0fdb91cebe9e9cb"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b31e67ff419013f99ad6f8fc73ee19ea31585e1e9fe773744c0f3ce58c039c30"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c14b29d9e1529f99efd550cd04dbb6db6ba5d690abb96d52de2bff4ed518bc95"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c40f3470e084d31247aea228aa1c39bbc0904c2b9ccbf5d3cfa2ea2dac06f26d"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-win32.whl", hash = "sha256:706bfa02157b97c136547c406f263e4c6274a7b061b3eb9742915dd774bbc264"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-win_amd64.whl", hash = "sha256:a7f7b5c07ae5c0cfd24c2db86071fb2a3d947da7bd487e359cc91e67ac1c6d2e"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:4afbbf5ef41ac18e02c8dc1f86c04b22b7a2125f2a030e25bbb4aff31abb224b"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24e300c0c2147484a002b175f4e1361f102e82c345bf263242f0449672a4bccf"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:201de072b818f8ad55c80d18d1a788729cccf9be6d9dc3b9d8613b053cd4836d"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653ed6817c710d0c95558232aba799307d14ae084cc9b1f4c389157ec50df5c"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-win32.whl", hash = "sha256:647e0b309cb4512b1f1b78471fdaf72921b6fa6e750b9f891e09c6e2f0e5326f"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-win_amd64.whl", hash = "sha256:ab73ed1a05ff539afc4a7f8cf371764cdf79768ecb7d2ec691e3ff89abbc541e"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:37ce517c011560d68f1ffb28af65d7e06f873f191eb3a73af5671e9c3fada08a"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1878ce508edea4a879015ab5215546c444233881301e97ca16fe251e89f1c55"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e8e608983e6f85d0852ca61f97e521b62e67969e6e640fe6c6b575d4db68557"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccf956da45290df6e809ea12c54c02ace7f8ff4d765d6d3dfb3655ee876ce58d"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-win32.whl", hash = "sha256:f167c8175ab908ce48bd6550679cc6ea20ae169379e73c7720a28f89e53aa532"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-win_amd64.whl", hash = "sha256:45806315aae81a0c202752558f0df52b42d11dd7ba0097bf71e253b4215f34f4"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:b6d0c4b15d65087738a6e22e0ff461b407533ff65a73b818089efc8eb2b3e1de"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a843e34abfd4c797018fd8d00ffffa99fd5184c421f190b6ca99def4087689bd"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c890421651b45a681181301b3497e4d57c0d01dc001e10438a40e9a9c25ee77"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d26f280b8f0a8f497bc10573849ad6dc62e671d2468826e5c748d04ed9e670d5"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-win32.whl", hash = "sha256:ec2268de67f73b43320383947e74700e95c6770d0c68c4e615e9897e46296294"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-win_amd64.whl", hash = "sha256:bbdf16372859b8ed3f4d05f925a984771cd2abd18bd187042f24be4886c2a15f"}, + {file = "SQLAlchemy-1.4.49.tar.gz", hash = "sha256:06ff25cbae30c396c4b7737464f2a7fc37a67b7da409993b182b024cec80aed9"}, +] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\")"} [package.extras] aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] @@ -1034,22 +2142,25 @@ mssql-pyodbc = ["pyodbc"] mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=7)", "cx_oracle (>=7,<8)"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] pymysql = ["pymysql", "pymysql (<1)"] -sqlcipher = ["sqlcipher3_binary"] +sqlcipher = ["sqlcipher3-binary"] [[package]] name = "starlette" version = "0.20.4" description = "The little ASGI library that shines." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "starlette-0.20.4-py3-none-any.whl", hash = "sha256:c0414d5a56297d37f3db96a84034d61ce29889b9eaccf65eb98a0b39441fcaa3"}, + {file = "starlette-0.20.4.tar.gz", hash = "sha256:42fcf3122f998fefce3e2c5ad7e5edbf0f02cf685d646a83a08d404726af5084"}, +] [package.dependencies] anyio = ">=3.4.0,<5" @@ -1061,9 +2172,12 @@ full = ["itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests"] name = "table-meta" version = "0.1.5" description = "Universal class that created to be a middleware, universal mapping for data from different parsers - simple-ddl-parser and py-models-parser" -category = "main" optional = false python-versions = ">=3.6.2,<4.0" +files = [ + {file = "table-meta-0.1.5.tar.gz", hash = "sha256:66de6770ead04198f4fbce202e0091bc24d1391429df37d644328e5d54d3bb87"}, + {file = "table_meta-0.1.5-py3-none-any.whl", hash = "sha256:94166eea85db1e332f6860b7ca7f4361e51d66ce42d7596774a861d39029afb3"}, +] [package.dependencies] pydantic = ">=1.8.2,<2.0.0" @@ -1072,25 +2186,34 @@ pydantic = ">=1.8.2,<2.0.0" name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] [[package]] name = "tomlkit" -version = "0.11.8" +version = "0.12.1" description = "Style preserving TOML library" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, + {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, +] [[package]] name = "tqdm" version = "4.65.0" description = "Fast, Extensible Progress Meter" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, + {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -1105,9 +2228,12 @@ telegram = ["requests"] name = "typer" version = "0.9.0" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." -category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "typer-0.9.0-py3-none-any.whl", hash = "sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee"}, + {file = "typer-0.9.0.tar.gz", hash = "sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2"}, +] [package.dependencies] click = ">=7.1.1,<9.0.0" @@ -1123,25 +2249,45 @@ test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6. name = "types-pytz" version = "2023.3.0.0" description = "Typing stubs for pytz" -category = "main" optional = false python-versions = "*" +files = [ + {file = "types-pytz-2023.3.0.0.tar.gz", hash = "sha256:ecdc70d543aaf3616a7e48631543a884f74205f284cefd6649ddf44c6a820aac"}, + {file = "types_pytz-2023.3.0.0-py3-none-any.whl", hash = "sha256:4fc2a7fbbc315f0b6630e0b899fd6c743705abe1094d007b0e612d10da15e0f3"}, +] + +[[package]] +name = "types-pyyaml" +version = "6.0.12.11" +description = "Typing stubs for PyYAML" +optional = false +python-versions = "*" +files = [ + {file = "types-PyYAML-6.0.12.11.tar.gz", hash = "sha256:7d340b19ca28cddfdba438ee638cd4084bde213e501a3978738543e27094775b"}, + {file = "types_PyYAML-6.0.12.11-py3-none-any.whl", hash = "sha256:a461508f3096d1d5810ec5ab95d7eeecb651f3a15b71959999988942063bf01d"}, +] [[package]] name = "typing-extensions" -version = "4.6.1" +version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] [[package]] name = "urllib3" version = "1.26.16" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, + {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, +] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] @@ -1152,9 +2298,12 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] name = "uvicorn" version = "0.19.0" description = "The lightning-fast ASGI server." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "uvicorn-0.19.0-py3-none-any.whl", hash = "sha256:cc277f7e73435748e69e075a721841f7c4a95dba06d12a72fe9874acced16f6f"}, + {file = "uvicorn-0.19.0.tar.gz", hash = "sha256:cf538f3018536edb1f4a826311137ab4944ed741d52aeb98846f52215de57f25"}, +] [package.dependencies] click = ">=7.0" @@ -1165,1213 +2314,224 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [[package]] name = "virtualenv" -version = "20.23.0" +version = "20.24.2" description = "Virtual Python Environment builder" -category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.24.2-py3-none-any.whl", hash = "sha256:43a3052be36080548bdee0b42919c88072037d50d56c28bd3f853cbe92b953ff"}, + {file = "virtualenv-20.24.2.tar.gz", hash = "sha256:fd8a78f46f6b99a67b7ec5cf73f92357891a7b3a40fd97637c27f854aae3b9e0"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<4" + +[package.extras] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "werkzeug" +version = "2.3.6" +description = "The comprehensive WSGI web application library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Werkzeug-2.3.6-py3-none-any.whl", hash = "sha256:935539fa1413afbb9195b24880778422ed620c0fc09670945185cce4d91a8890"}, + {file = "Werkzeug-2.3.6.tar.gz", hash = "sha256:98c774df2f91b05550078891dee5f0eb0cb797a522c757a2452b9cee5b202330"}, +] [package.dependencies] -distlib = ">=0.3.6,<1" -filelock = ">=3.11,<4" -platformdirs = ">=3.2,<4" +MarkupSafe = ">=2.1.1" [package.extras] -docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.7.1)", "time-machine (>=2.9)"] +watchdog = ["watchdog (>=2.3)"] [[package]] name = "wrapt" version = "1.15.0" description = "Module for decorators, wrappers and monkey patching." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] + +[[package]] +name = "xmltodict" +version = "0.13.0" +description = "Makes working with XML feel like you are working with JSON" +optional = false +python-versions = ">=3.4" +files = [ + {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, + {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, +] [[package]] name = "yarl" version = "1.9.2" description = "Yet another URL library" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, +] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" [metadata] -lock-version = "1.1" +lock-version = "2.0" python-versions = "^3.10" -content-hash = "3f590c2d97e2ef4d5f2c9ce7b0f4de4a3117c441c876773b0a11e268e5135a91" - -[metadata.files] -aiobotocore = [ - {file = "aiobotocore-2.4.2-py3-none-any.whl", hash = "sha256:4acd1ebe2e44be4b100aa553910bda899f6dc090b3da2bc1cf3d5de2146ed208"}, - {file = "aiobotocore-2.4.2.tar.gz", hash = "sha256:0603b74a582dffa7511ce7548d07dc9b10ec87bc5fb657eb0b34f9bd490958bf"}, -] -aiohttp = [ - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, - {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, - {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, - {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, - {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, - {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, - {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, - {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, - {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, - {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, - {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, - {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, -] -aioitertools = [ - {file = "aioitertools-0.11.0-py3-none-any.whl", hash = "sha256:04b95e3dab25b449def24d7df809411c10e62aab0cbe31a50ca4e68748c43394"}, - {file = "aioitertools-0.11.0.tar.gz", hash = "sha256:42c68b8dd3a69c2bf7f2233bf7df4bb58b557bca5252ac02ed5187bbc67d6831"}, -] -aiosignal = [ - {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, - {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, -] -alembic = [ - {file = "alembic-1.11.1-py3-none-any.whl", hash = "sha256:dc871798a601fab38332e38d6ddb38d5e734f60034baeb8e2db5b642fccd8ab8"}, - {file = "alembic-1.11.1.tar.gz", hash = "sha256:6a810a6b012c88b33458fceb869aef09ac75d6ace5291915ba7fae44de372c01"}, -] -anyio = [ - {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, - {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, -] -astroid = [ - {file = "astroid-2.15.5-py3-none-any.whl", hash = "sha256:078e5212f9885fa85fbb0cf0101978a336190aadea6e13305409d099f71b2324"}, - {file = "astroid-2.15.5.tar.gz", hash = "sha256:1039262575027b441137ab4a62a793a9b43defb42c32d5670f38686207cd780f"}, -] -async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] -attrs = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, -] -black = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, - {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, - {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, - {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, - {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, - {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, -] -boto3 = [ - {file = "boto3-1.24.0-py3-none-any.whl", hash = "sha256:a42900a0ea75600a76b371b03ac645461e4f3c97bb13ae5136bb4d3c87c6c110"}, - {file = "boto3-1.24.0.tar.gz", hash = "sha256:8df0215521969e229a6a004eedc6a484a3656611ddee698419d3658ae9c53c50"}, -] -botocore = [ - {file = "botocore-1.27.59-py3-none-any.whl", hash = "sha256:69d756791fc024bda54f6c53f71ae34e695ee41bbbc1743d9179c4837a4929da"}, - {file = "botocore-1.27.59.tar.gz", hash = "sha256:eda4aed6ee719a745d1288eaf1beb12f6f6448ad1fa12f159405db14ba9c92cf"}, -] -certifi = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, -] -cfgv = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, -] -charset-normalizer = [ - {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, - {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, -] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] -colorama = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -dbml-builder = [ - {file = "dbml_builder-0.3.0-py3-none-any.whl", hash = "sha256:6c00d59a16047b63e5d6640d4bd6805189b425d33287e844f980ccd957d5de4a"}, - {file = "dbml_builder-0.3.0.tar.gz", hash = "sha256:98f79a347de6702335af86a0f2fd3101daad54b2110b8f5102d0e446a275543b"}, -] -dill = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, -] -distlib = [ - {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, - {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, -] -elastic-transport = [ - {file = "elastic-transport-8.4.0.tar.gz", hash = "sha256:b9ad708ceb7fcdbc6b30a96f886609a109f042c0b9d9f2e44403b3133ba7ff10"}, - {file = "elastic_transport-8.4.0-py3-none-any.whl", hash = "sha256:19db271ab79c9f70f8c43f8f5b5111408781a6176b54ab2e54d713b6d9ceb815"}, -] -elasticsearch = [ - {file = "elasticsearch-8.5.3-py3-none-any.whl", hash = "sha256:f09adbea8caa633ff79e8fe115fb1d2b635426fe1a23e7e8e3bd7cce5ac3eb70"}, - {file = "elasticsearch-8.5.3.tar.gz", hash = "sha256:4b71ad05b36243c3b13f1c89b3ede4357011eece68917e293c43d4177d565838"}, -] -et-xmlfile = [ - {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, - {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, -] -exceptiongroup = [ - {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, - {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, -] -fastapi = [ - {file = "fastapi-0.85.2-py3-none-any.whl", hash = "sha256:6292db0edd4a11f0d938d6033ccec5f706e9d476958bf33b119e8ddb4e524bde"}, - {file = "fastapi-0.85.2.tar.gz", hash = "sha256:3e10ea0992c700e0b17b6de8c2092d7b9cd763ce92c49ee8d4be10fee3b2f367"}, -] -filelock = [ - {file = "filelock-3.12.0-py3-none-any.whl", hash = "sha256:ad98852315c2ab702aeb628412cbf7e95b7ce8c3bf9565670b4eaecf1db370a9"}, - {file = "filelock-3.12.0.tar.gz", hash = "sha256:fc03ae43288c013d2ea83c8597001b1129db351aad9c57fe2409327916b8e718"}, -] -frozenlist = [ - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, - {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, - {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, - {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, - {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, - {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, - {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, - {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, - {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, - {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, - {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, -] -fsspec = [ - {file = "fsspec-2022.11.0-py3-none-any.whl", hash = "sha256:d6e462003e3dcdcb8c7aa84c73a228f8227e72453cd22570e2363e8844edfe7b"}, - {file = "fsspec-2022.11.0.tar.gz", hash = "sha256:259d5fd5c8e756ff2ea72f42e7613c32667dc2049a4ac3d84364a7ca034acb8b"}, -] -funcy = [ - {file = "funcy-1.18-py2.py3-none-any.whl", hash = "sha256:00ce91afc850357a131dc54f0db2ad8a1110d5087f1fa4480d7ea3ba0249f89d"}, - {file = "funcy-1.18.tar.gz", hash = "sha256:15448d19a8ebcc7a585afe7a384a19186d0bd67cbf56fb42cd1fd0f76313f9b2"}, -] -greenlet = [ - {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, - {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, - {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, - {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, - {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, - {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, - {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, - {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, - {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, - {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, - {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, - {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, - {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, - {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, - {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, - {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, - {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, - {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, - {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, - {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, - {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, - {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, - {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, - {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, - {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, - {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, -] -h11 = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] -identify = [ - {file = "identify-2.5.24-py2.py3-none-any.whl", hash = "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d"}, - {file = "identify-2.5.24.tar.gz", hash = "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4"}, -] -idna = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] -iniconfig = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] -isort = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, -] -jinja2 = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] -jmespath = [ - {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, - {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, -] -lazy-object-proxy = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, -] -mako = [ - {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, - {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, - {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, -] -mccabe = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] -minio = [ - {file = "minio-7.1.15-py3-none-any.whl", hash = "sha256:1afdf01c1bc8b57ddd12d438e3e168d625465b56f4d1c2af7576744c688e84c6"}, - {file = "minio-7.1.15.tar.gz", hash = "sha256:fcf8ac2cef310d5ddff2bef2c42f4e5a8bb546b87bca5bf8832135db054ca4e1"}, -] -multidict = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, -] -mypy-extensions = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] -neo4j = [ - {file = "neo4j-5.8.1.tar.gz", hash = "sha256:79c947f402e9f8624587add7b8af742b38cbcdf364d48021c5bff9220457965b"}, -] -nodeenv = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, -] -numpy = [ - {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, - {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, - {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, - {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, - {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, - {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, - {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, - {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, - {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, - {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, - {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, -] -omymodels = [ - {file = "omymodels-0.12.1-py3-none-any.whl", hash = "sha256:854c6013de03d665fae6809f6acc9bec998ac173282afae45fad1737f971e53b"}, - {file = "omymodels-0.12.1.tar.gz", hash = "sha256:dd9a6ad27c11fe4f7cc37a8eccbafd0e00cc1ed4757e6fe342bfe14fd599ccff"}, -] -openai = [ - {file = "openai-0.25.0.tar.gz", hash = "sha256:59ac6531e4f7bf8e9a53186e853d9ffb1d5f07973ecb4f7d273163a314814510"}, -] -openpyxl = [ - {file = "openpyxl-3.1.2-py2.py3-none-any.whl", hash = "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5"}, - {file = "openpyxl-3.1.2.tar.gz", hash = "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184"}, -] -packaging = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, -] -pandas = [ - {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, - {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, - {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, - {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, - {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, - {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, - {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, - {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, - {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, - {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, - {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, - {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, - {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, - {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, - {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, - {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, - {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, - {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, -] -pandas-stubs = [ - {file = "pandas_stubs-2.0.1.230501-py3-none-any.whl", hash = "sha256:7ffc6528290df44881d1d78b7239161ba203e4b6570b71949fc4a4e5eabca8a5"}, - {file = "pandas_stubs-2.0.1.230501.tar.gz", hash = "sha256:2faf2c08ecfd8f5b82823279e06818d92eb642079e73d93921779bad69bd4cb0"}, -] -parsimonious = [ - {file = "parsimonious-0.8.1.tar.gz", hash = "sha256:3add338892d580e0cb3b1a39e4a1b427ff9f687858fdd61097053742391a9f6b"}, -] -pathspec = [ - {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, - {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, -] -platformdirs = [ - {file = "platformdirs-3.5.1-py3-none-any.whl", hash = "sha256:e2378146f1964972c03c085bb5662ae80b2b8c06226c54b2ff4aa9483e8a13a5"}, - {file = "platformdirs-3.5.1.tar.gz", hash = "sha256:412dae91f52a6f84830f39a8078cecd0e866cb72294a5c66808e74d5e88d251f"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -ply = [ - {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, - {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, -] -pre-commit = [ - {file = "pre_commit-3.3.2-py2.py3-none-any.whl", hash = "sha256:8056bc52181efadf4aac792b1f4f255dfd2fb5a350ded7335d251a68561e8cb6"}, - {file = "pre_commit-3.3.2.tar.gz", hash = "sha256:66e37bec2d882de1f17f88075047ef8962581f83c234ac08da21a0c58953d1f0"}, -] -psycopg2 = [ - {file = "psycopg2-2.9.6-cp310-cp310-win32.whl", hash = "sha256:f7a7a5ee78ba7dc74265ba69e010ae89dae635eea0e97b055fb641a01a31d2b1"}, - {file = "psycopg2-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:f75001a1cbbe523e00b0ef896a5a1ada2da93ccd752b7636db5a99bc57c44494"}, - {file = "psycopg2-2.9.6-cp311-cp311-win32.whl", hash = "sha256:53f4ad0a3988f983e9b49a5d9765d663bbe84f508ed655affdb810af9d0972ad"}, - {file = "psycopg2-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b81fcb9ecfc584f661b71c889edeae70bae30d3ef74fa0ca388ecda50b1222b7"}, - {file = "psycopg2-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:11aca705ec888e4f4cea97289a0bf0f22a067a32614f6ef64fcf7b8bfbc53744"}, - {file = "psycopg2-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:36c941a767341d11549c0fbdbb2bf5be2eda4caf87f65dfcd7d146828bd27f39"}, - {file = "psycopg2-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:869776630c04f335d4124f120b7fb377fe44b0a7645ab3c34b4ba42516951889"}, - {file = "psycopg2-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:a8ad4a47f42aa6aec8d061fdae21eaed8d864d4bb0f0cade5ad32ca16fcd6258"}, - {file = "psycopg2-2.9.6-cp38-cp38-win32.whl", hash = "sha256:2362ee4d07ac85ff0ad93e22c693d0f37ff63e28f0615a16b6635a645f4b9214"}, - {file = "psycopg2-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:d24ead3716a7d093b90b27b3d73459fe8cd90fd7065cf43b3c40966221d8c394"}, - {file = "psycopg2-2.9.6-cp39-cp39-win32.whl", hash = "sha256:1861a53a6a0fd248e42ea37c957d36950da00266378746588eab4f4b5649e95f"}, - {file = "psycopg2-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:ded2faa2e6dfb430af7713d87ab4abbfc764d8d7fb73eafe96a24155f906ebf5"}, - {file = "psycopg2-2.9.6.tar.gz", hash = "sha256:f15158418fd826831b28585e2ab48ed8df2d0d98f502a2b4fe619e7d5ca29011"}, -] -py-models-parser = [ - {file = "py-models-parser-0.6.0.tar.gz", hash = "sha256:3dffed9ee79c9d7d62de1dfd939122bc6c48fc314c839c79d94d835f0d2633ae"}, - {file = "py_models_parser-0.6.0-py3-none-any.whl", hash = "sha256:0b6d0996ad56aa3fa98fe8ec2be74980e444959be84413ce855362f1573b8dfb"}, -] -pyarrow = [ - {file = "pyarrow-10.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:e00174764a8b4e9d8d5909b6d19ee0c217a6cf0232c5682e31fdfbd5a9f0ae52"}, - {file = "pyarrow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f7a7dbe2f7f65ac1d0bd3163f756deb478a9e9afc2269557ed75b1b25ab3610"}, - {file = "pyarrow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb627673cb98708ef00864e2e243f51ba7b4c1b9f07a1d821f98043eccd3f585"}, - {file = "pyarrow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba71e6fc348c92477586424566110d332f60d9a35cb85278f42e3473bc1373da"}, - {file = "pyarrow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b4ede715c004b6fc535de63ef79fa29740b4080639a5ff1ea9ca84e9282f349"}, - {file = "pyarrow-10.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:e3fe5049d2e9ca661d8e43fab6ad5a4c571af12d20a57dffc392a014caebef65"}, - {file = "pyarrow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:254017ca43c45c5098b7f2a00e995e1f8346b0fb0be225f042838323bb55283c"}, - {file = "pyarrow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70acca1ece4322705652f48db65145b5028f2c01c7e426c5d16a30ba5d739c24"}, - {file = "pyarrow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abb57334f2c57979a49b7be2792c31c23430ca02d24becd0b511cbe7b6b08649"}, - {file = "pyarrow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:1765a18205eb1e02ccdedb66049b0ec148c2a0cb52ed1fb3aac322dfc086a6ee"}, - {file = "pyarrow-10.0.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:61f4c37d82fe00d855d0ab522c685262bdeafd3fbcb5fe596fe15025fbc7341b"}, - {file = "pyarrow-10.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e141a65705ac98fa52a9113fe574fdaf87fe0316cde2dffe6b94841d3c61544c"}, - {file = "pyarrow-10.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf26f809926a9d74e02d76593026f0aaeac48a65b64f1bb17eed9964bfe7ae1a"}, - {file = "pyarrow-10.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:443eb9409b0cf78df10ced326490e1a300205a458fbeb0767b6b31ab3ebae6b2"}, - {file = "pyarrow-10.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:f2d00aa481becf57098e85d99e34a25dba5a9ade2f44eb0b7d80c80f2984fc03"}, - {file = "pyarrow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b1fc226d28c7783b52a84d03a66573d5a22e63f8a24b841d5fc68caeed6784d4"}, - {file = "pyarrow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efa59933b20183c1c13efc34bd91efc6b2997377c4c6ad9272da92d224e3beb1"}, - {file = "pyarrow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:668e00e3b19f183394388a687d29c443eb000fb3fe25599c9b4762a0afd37775"}, - {file = "pyarrow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1bc6e4d5d6f69e0861d5d7f6cf4d061cf1069cb9d490040129877acf16d4c2a"}, - {file = "pyarrow-10.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:42ba7c5347ce665338f2bc64685d74855900200dac81a972d49fe127e8132f75"}, - {file = "pyarrow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b069602eb1fc09f1adec0a7bdd7897f4d25575611dfa43543c8b8a75d99d6874"}, - {file = "pyarrow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94fb4a0c12a2ac1ed8e7e2aa52aade833772cf2d3de9dde685401b22cec30002"}, - {file = "pyarrow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db0c5986bf0808927f49640582d2032a07aa49828f14e51f362075f03747d198"}, - {file = "pyarrow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:0ec7587d759153f452d5263dbc8b1af318c4609b607be2bd5127dcda6708cdb1"}, - {file = "pyarrow-10.0.1.tar.gz", hash = "sha256:1a14f57a5f472ce8234f2964cd5184cccaa8df7e04568c64edc33b23eb285dd5"}, -] -pydantic = [ - {file = "pydantic-1.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1243d28e9b05003a89d72e7915fdb26ffd1d39bdd39b00b7dbe4afae4b557f9d"}, - {file = "pydantic-1.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0ab53b609c11dfc0c060d94335993cc2b95b2150e25583bec37a49b2d6c6c3f"}, - {file = "pydantic-1.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9613fadad06b4f3bc5db2653ce2f22e0de84a7c6c293909b48f6ed37b83c61f"}, - {file = "pydantic-1.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df7800cb1984d8f6e249351139667a8c50a379009271ee6236138a22a0c0f319"}, - {file = "pydantic-1.10.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0c6fafa0965b539d7aab0a673a046466d23b86e4b0e8019d25fd53f4df62c277"}, - {file = "pydantic-1.10.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e82d4566fcd527eae8b244fa952d99f2ca3172b7e97add0b43e2d97ee77f81ab"}, - {file = "pydantic-1.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:ab523c31e22943713d80d8d342d23b6f6ac4b792a1e54064a8d0cf78fd64e800"}, - {file = "pydantic-1.10.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:666bdf6066bf6dbc107b30d034615d2627e2121506c555f73f90b54a463d1f33"}, - {file = "pydantic-1.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:35db5301b82e8661fa9c505c800d0990bc14e9f36f98932bb1d248c0ac5cada5"}, - {file = "pydantic-1.10.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90c1e29f447557e9e26afb1c4dbf8768a10cc676e3781b6a577841ade126b85"}, - {file = "pydantic-1.10.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93e766b4a8226e0708ef243e843105bf124e21331694367f95f4e3b4a92bbb3f"}, - {file = "pydantic-1.10.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:88f195f582851e8db960b4a94c3e3ad25692c1c1539e2552f3df7a9e972ef60e"}, - {file = "pydantic-1.10.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:34d327c81e68a1ecb52fe9c8d50c8a9b3e90d3c8ad991bfc8f953fb477d42fb4"}, - {file = "pydantic-1.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:d532bf00f381bd6bc62cabc7d1372096b75a33bc197a312b03f5838b4fb84edd"}, - {file = "pydantic-1.10.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d5b8641c24886d764a74ec541d2fc2c7fb19f6da2a4001e6d580ba4a38f7878"}, - {file = "pydantic-1.10.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1f6cb446470b7ddf86c2e57cd119a24959af2b01e552f60705910663af09a4"}, - {file = "pydantic-1.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c33b60054b2136aef8cf190cd4c52a3daa20b2263917c49adad20eaf381e823b"}, - {file = "pydantic-1.10.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1952526ba40b220b912cdc43c1c32bcf4a58e3f192fa313ee665916b26befb68"}, - {file = "pydantic-1.10.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bb14388ec45a7a0dc429e87def6396f9e73c8c77818c927b6a60706603d5f2ea"}, - {file = "pydantic-1.10.8-cp37-cp37m-win_amd64.whl", hash = "sha256:16f8c3e33af1e9bb16c7a91fc7d5fa9fe27298e9f299cff6cb744d89d573d62c"}, - {file = "pydantic-1.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ced8375969673929809d7f36ad322934c35de4af3b5e5b09ec967c21f9f7887"}, - {file = "pydantic-1.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93e6bcfccbd831894a6a434b0aeb1947f9e70b7468f274154d03d71fabb1d7c6"}, - {file = "pydantic-1.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:191ba419b605f897ede9892f6c56fb182f40a15d309ef0142212200a10af4c18"}, - {file = "pydantic-1.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:052d8654cb65174d6f9490cc9b9a200083a82cf5c3c5d3985db765757eb3b375"}, - {file = "pydantic-1.10.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ceb6a23bf1ba4b837d0cfe378329ad3f351b5897c8d4914ce95b85fba96da5a1"}, - {file = "pydantic-1.10.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f2e754d5566f050954727c77f094e01793bcb5725b663bf628fa6743a5a9108"}, - {file = "pydantic-1.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:6a82d6cda82258efca32b40040228ecf43a548671cb174a1e81477195ed3ed56"}, - {file = "pydantic-1.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e59417ba8a17265e632af99cc5f35ec309de5980c440c255ab1ca3ae96a3e0e"}, - {file = "pydantic-1.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:84d80219c3f8d4cad44575e18404099c76851bc924ce5ab1c4c8bb5e2a2227d0"}, - {file = "pydantic-1.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e4148e635994d57d834be1182a44bdb07dd867fa3c2d1b37002000646cc5459"}, - {file = "pydantic-1.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12f7b0bf8553e310e530e9f3a2f5734c68699f42218bf3568ef49cd9b0e44df4"}, - {file = "pydantic-1.10.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42aa0c4b5c3025483240a25b09f3c09a189481ddda2ea3a831a9d25f444e03c1"}, - {file = "pydantic-1.10.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17aef11cc1b997f9d574b91909fed40761e13fac438d72b81f902226a69dac01"}, - {file = "pydantic-1.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:66a703d1983c675a6e0fed8953b0971c44dba48a929a2000a493c3772eb61a5a"}, - {file = "pydantic-1.10.8-py3-none-any.whl", hash = "sha256:7456eb22ed9aaa24ff3e7b4757da20d9e5ce2a81018c1b3ebd81a0b88a18f3b2"}, - {file = "pydantic-1.10.8.tar.gz", hash = "sha256:1410275520dfa70effadf4c21811d755e7ef9bb1f1d077a21958153a92c8d9ca"}, -] -pydbml = [ - {file = "pydbml-1.0.9-py3-none-any.whl", hash = "sha256:daf980325a7dd8b8d4d1ddc9814b80bc3f45d76d5b5c7a996154b6681e505b60"}, - {file = "pydbml-1.0.9.tar.gz", hash = "sha256:2017750418721d505bfc67daf024c5e4ef4126dff708264566ef1be2d18fef2f"}, -] -pylint = [ - {file = "pylint-2.17.4-py3-none-any.whl", hash = "sha256:7a1145fb08c251bdb5cca11739722ce64a63db479283d10ce718b2460e54123c"}, - {file = "pylint-2.17.4.tar.gz", hash = "sha256:5dcf1d9e19f41f38e4e85d10f511e5b9c35e1aa74251bf95cdd8cb23584e2db1"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -pytest = [ - {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, - {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, -] -pytest-alembic = [ - {file = "pytest_alembic-0.10.5-py3-none-any.whl", hash = "sha256:b273eedc46d521e02ea8ee6481353af072b533dd2aa93ade1113d87f57a3dd94"}, - {file = "pytest_alembic-0.10.5.tar.gz", hash = "sha256:69f96a6e1cd3217e46e4df9f797e08e17a162c4a071e027bef43ebab961e7a53"}, -] -pytest-mock-resources = [ - {file = "pytest_mock_resources-2.6.13-py3-none-any.whl", hash = "sha256:5718b47526ff2e615aff0e48c06f80d16a9e1878943976cd11c3d4671f381ff8"}, - {file = "pytest_mock_resources-2.6.13.tar.gz", hash = "sha256:10a7237ca93d6f691e33ed9c2a21b9237c401c35c39e60d02a8f9e5d062f5fe5"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] -python-multipart = [ - {file = "python-multipart-0.0.5.tar.gz", hash = "sha256:f7bb5f611fc600d15fa47b3974c8aa16e93724513b49b5f95c81e6624c83fa43"}, -] -python-on-whales = [ - {file = "python-on-whales-0.59.0.tar.gz", hash = "sha256:d60c9c7c723a69a8d22038a4bede44e93b08ab2fbdbfec4e62cf3508c4f6501c"}, - {file = "python_on_whales-0.59.0-py3-none-any.whl", hash = "sha256:0aaf447e78190f9085e2aa9dae6866d5038a4f6ac63a16d389f12df26e2ffcf4"}, -] -pytz = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, -] -pyyaml = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] -requests = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, -] -s3fs = [ - {file = "s3fs-2022.11.0-py3-none-any.whl", hash = "sha256:42d57a3ceedb478b18ee53e34bbe3305a3f07f6381ca1ab76135efe076c6a07d"}, - {file = "s3fs-2022.11.0.tar.gz", hash = "sha256:10c5ac283a4f5b67ffad6d1f25ff7ee026142750c5c5dc868746cd904f617c33"}, -] -s3transfer = [ - {file = "s3transfer-0.6.1-py3-none-any.whl", hash = "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346"}, - {file = "s3transfer-0.6.1.tar.gz", hash = "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9"}, -] -setuptools = [ - {file = "setuptools-67.8.0-py3-none-any.whl", hash = "sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f"}, - {file = "setuptools-67.8.0.tar.gz", hash = "sha256:62642358adc77ffa87233bc4d2354c4b2682d214048f500964dbe760ccedf102"}, -] -simple-ddl-parser = [ - {file = "simple-ddl-parser-0.27.0.tar.gz", hash = "sha256:1db574307022f14081aba245cb36c0e702ac31232f783e910b727df4c7de2929"}, - {file = "simple_ddl_parser-0.27.0-py3-none-any.whl", hash = "sha256:e8692480e45195bf04ba00d3043d333e27dd745b6c9daf00af1041e64735691e"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -sniffio = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, -] -sqlalchemy = [ - {file = "SQLAlchemy-1.4.48-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:4bac3aa3c3d8bc7408097e6fe8bf983caa6e9491c5d2e2488cfcfd8106f13b6a"}, - {file = "SQLAlchemy-1.4.48-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:dbcae0e528d755f4522cad5842f0942e54b578d79f21a692c44d91352ea6d64e"}, - {file = "SQLAlchemy-1.4.48-cp27-cp27m-win32.whl", hash = "sha256:cbbe8b8bffb199b225d2fe3804421b7b43a0d49983f81dc654d0431d2f855543"}, - {file = "SQLAlchemy-1.4.48-cp27-cp27m-win_amd64.whl", hash = "sha256:627e04a5d54bd50628fc8734d5fc6df2a1aa5962f219c44aad50b00a6cdcf965"}, - {file = "SQLAlchemy-1.4.48-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9af1db7a287ef86e0f5cd990b38da6bd9328de739d17e8864f1817710da2d217"}, - {file = "SQLAlchemy-1.4.48-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:ce7915eecc9c14a93b73f4e1c9d779ca43e955b43ddf1e21df154184f39748e5"}, - {file = "SQLAlchemy-1.4.48-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5381ddd09a99638f429f4cbe1b71b025bed318f6a7b23e11d65f3eed5e181c33"}, - {file = "SQLAlchemy-1.4.48-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:87609f6d4e81a941a17e61a4c19fee57f795e96f834c4f0a30cee725fc3f81d9"}, - {file = "SQLAlchemy-1.4.48-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb0808ad34167f394fea21bd4587fc62f3bd81bba232a1e7fbdfa17e6cfa7cd7"}, - {file = "SQLAlchemy-1.4.48-cp310-cp310-win32.whl", hash = "sha256:d53cd8bc582da5c1c8c86b6acc4ef42e20985c57d0ebc906445989df566c5603"}, - {file = "SQLAlchemy-1.4.48-cp310-cp310-win_amd64.whl", hash = "sha256:4355e5915844afdc5cf22ec29fba1010166e35dd94a21305f49020022167556b"}, - {file = "SQLAlchemy-1.4.48-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:066c2b0413e8cb980e6d46bf9d35ca83be81c20af688fedaef01450b06e4aa5e"}, - {file = "SQLAlchemy-1.4.48-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c99bf13e07140601d111a7c6f1fc1519914dd4e5228315bbda255e08412f61a4"}, - {file = "SQLAlchemy-1.4.48-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee26276f12614d47cc07bc85490a70f559cba965fb178b1c45d46ffa8d73fda"}, - {file = "SQLAlchemy-1.4.48-cp311-cp311-win32.whl", hash = "sha256:49c312bcff4728bffc6fb5e5318b8020ed5c8b958a06800f91859fe9633ca20e"}, - {file = "SQLAlchemy-1.4.48-cp311-cp311-win_amd64.whl", hash = "sha256:cef2e2abc06eab187a533ec3e1067a71d7bbec69e582401afdf6d8cad4ba3515"}, - {file = "SQLAlchemy-1.4.48-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3509159e050bd6d24189ec7af373359f07aed690db91909c131e5068176c5a5d"}, - {file = "SQLAlchemy-1.4.48-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc2ab4d9f6d9218a5caa4121bdcf1125303482a1cdcfcdbd8567be8518969c0"}, - {file = "SQLAlchemy-1.4.48-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e1ddbbcef9bcedaa370c03771ebec7e39e3944782bef49e69430383c376a250b"}, - {file = "SQLAlchemy-1.4.48-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f82d8efea1ca92b24f51d3aea1a82897ed2409868a0af04247c8c1e4fef5890"}, - {file = "SQLAlchemy-1.4.48-cp36-cp36m-win32.whl", hash = "sha256:e3e98d4907805b07743b583a99ecc58bf8807ecb6985576d82d5e8ae103b5272"}, - {file = "SQLAlchemy-1.4.48-cp36-cp36m-win_amd64.whl", hash = "sha256:25887b4f716e085a1c5162f130b852f84e18d2633942c8ca40dfb8519367c14f"}, - {file = "SQLAlchemy-1.4.48-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:0817c181271b0ce5df1aa20949f0a9e2426830fed5ecdcc8db449618f12c2730"}, - {file = "SQLAlchemy-1.4.48-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe1dd2562313dd9fe1778ed56739ad5d9aae10f9f43d9f4cf81d65b0c85168bb"}, - {file = "SQLAlchemy-1.4.48-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:68413aead943883b341b2b77acd7a7fe2377c34d82e64d1840860247cec7ff7c"}, - {file = "SQLAlchemy-1.4.48-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbde5642104ac6e95f96e8ad6d18d9382aa20672008cf26068fe36f3004491df"}, - {file = "SQLAlchemy-1.4.48-cp37-cp37m-win32.whl", hash = "sha256:11c6b1de720f816c22d6ad3bbfa2f026f89c7b78a5c4ffafb220e0183956a92a"}, - {file = "SQLAlchemy-1.4.48-cp37-cp37m-win_amd64.whl", hash = "sha256:eb5464ee8d4bb6549d368b578e9529d3c43265007193597ddca71c1bae6174e6"}, - {file = "SQLAlchemy-1.4.48-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:92e6133cf337c42bfee03ca08c62ba0f2d9695618c8abc14a564f47503157be9"}, - {file = "SQLAlchemy-1.4.48-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d29a3fc6d9c45962476b470a81983dd8add6ad26fdbfae6d463b509d5adcda"}, - {file = "SQLAlchemy-1.4.48-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:005e942b451cad5285015481ae4e557ff4154dde327840ba91b9ac379be3b6ce"}, - {file = "SQLAlchemy-1.4.48-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8cfe951ed074ba5e708ed29c45397a95c4143255b0d022c7c8331a75ae61f3"}, - {file = "SQLAlchemy-1.4.48-cp38-cp38-win32.whl", hash = "sha256:2b9af65cc58726129d8414fc1a1a650dcdd594ba12e9c97909f1f57d48e393d3"}, - {file = "SQLAlchemy-1.4.48-cp38-cp38-win_amd64.whl", hash = "sha256:2b562e9d1e59be7833edf28b0968f156683d57cabd2137d8121806f38a9d58f4"}, - {file = "SQLAlchemy-1.4.48-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:a1fc046756cf2a37d7277c93278566ddf8be135c6a58397b4c940abf837011f4"}, - {file = "SQLAlchemy-1.4.48-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d9b55252d2ca42a09bcd10a697fa041e696def9dfab0b78c0aaea1485551a08"}, - {file = "SQLAlchemy-1.4.48-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6dab89874e72a9ab5462997846d4c760cdb957958be27b03b49cf0de5e5c327c"}, - {file = "SQLAlchemy-1.4.48-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fd8b5ee5a3acc4371f820934b36f8109ce604ee73cc668c724abb054cebcb6e"}, - {file = "SQLAlchemy-1.4.48-cp39-cp39-win32.whl", hash = "sha256:eee09350fd538e29cfe3a496ec6f148504d2da40dbf52adefb0d2f8e4d38ccc4"}, - {file = "SQLAlchemy-1.4.48-cp39-cp39-win_amd64.whl", hash = "sha256:7ad2b0f6520ed5038e795cc2852eb5c1f20fa6831d73301ced4aafbe3a10e1f6"}, - {file = "SQLAlchemy-1.4.48.tar.gz", hash = "sha256:b47bc287096d989a0838ce96f7d8e966914a24da877ed41a7531d44b55cdb8df"}, -] -starlette = [ - {file = "starlette-0.20.4-py3-none-any.whl", hash = "sha256:c0414d5a56297d37f3db96a84034d61ce29889b9eaccf65eb98a0b39441fcaa3"}, - {file = "starlette-0.20.4.tar.gz", hash = "sha256:42fcf3122f998fefce3e2c5ad7e5edbf0f02cf685d646a83a08d404726af5084"}, -] -table-meta = [ - {file = "table-meta-0.1.5.tar.gz", hash = "sha256:66de6770ead04198f4fbce202e0091bc24d1391429df37d644328e5d54d3bb87"}, - {file = "table_meta-0.1.5-py3-none-any.whl", hash = "sha256:94166eea85db1e332f6860b7ca7f4361e51d66ce42d7596774a861d39029afb3"}, -] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] -tomlkit = [ - {file = "tomlkit-0.11.8-py3-none-any.whl", hash = "sha256:8c726c4c202bdb148667835f68d68780b9a003a9ec34167b6c673b38eff2a171"}, - {file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, -] -tqdm = [ - {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, - {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, -] -typer = [ - {file = "typer-0.9.0-py3-none-any.whl", hash = "sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee"}, - {file = "typer-0.9.0.tar.gz", hash = "sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2"}, -] -types-pytz = [ - {file = "types-pytz-2023.3.0.0.tar.gz", hash = "sha256:ecdc70d543aaf3616a7e48631543a884f74205f284cefd6649ddf44c6a820aac"}, - {file = "types_pytz-2023.3.0.0-py3-none-any.whl", hash = "sha256:4fc2a7fbbc315f0b6630e0b899fd6c743705abe1094d007b0e612d10da15e0f3"}, -] -typing-extensions = [ - {file = "typing_extensions-4.6.1-py3-none-any.whl", hash = "sha256:6bac751f4789b135c43228e72de18637e9a6c29d12777023a703fd1a6858469f"}, - {file = "typing_extensions-4.6.1.tar.gz", hash = "sha256:558bc0c4145f01e6405f4a5fdbd82050bd221b119f4bf72a961a1cfd471349d6"}, -] -urllib3 = [ - {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, - {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, -] -uvicorn = [ - {file = "uvicorn-0.19.0-py3-none-any.whl", hash = "sha256:cc277f7e73435748e69e075a721841f7c4a95dba06d12a72fe9874acced16f6f"}, - {file = "uvicorn-0.19.0.tar.gz", hash = "sha256:cf538f3018536edb1f4a826311137ab4944ed741d52aeb98846f52215de57f25"}, -] -virtualenv = [ - {file = "virtualenv-20.23.0-py3-none-any.whl", hash = "sha256:6abec7670e5802a528357fdc75b26b9f57d5d92f29c5462ba0fbe45feacc685e"}, - {file = "virtualenv-20.23.0.tar.gz", hash = "sha256:a85caa554ced0c0afbd0d638e7e2d7b5f92d23478d05d17a76daeac8f279f924"}, -] -wrapt = [ - {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, - {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, - {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, - {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, - {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, - {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, - {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, - {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, - {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, - {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, - {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, - {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, - {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, - {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, - {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, - {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, - {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, - {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, - {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, -] -yarl = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, -] +content-hash = "cc7ff661393e30e8d3f994bca058ef0a0afc9c10b51078e2ae2c9fbd20e8802e" From 6f057dbe97ba8b16cbfaba458613c1749ea3038c Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:41:20 -0700 Subject: [PATCH 083/140] Added sql items to settings for test. --- tds/settings.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tds/settings.py b/tds/settings.py index 9c06c8478..4286bf5ff 100644 --- a/tds/settings.py +++ b/tds/settings.py @@ -15,10 +15,12 @@ class Settings(BaseSettings): GENERATED_PATH: str = "./tds/autogen" DBML_PATH: str = "./askem.dbml" SQL_URL: str = "rdb" + SQL_PROTOCOL: Optional[str] = "postgresql+psycopg2" SQL_PORT: int = 8032 SQL_USER: str = "dev" SQL_PASSWORD: str = "dev" SQL_DB: str = "askem" + SQL_CONN_STR: Optional[str] = None DKG_URL = "http://34.230.33.149" DKG_API_PORT = 8771 DKG_DESC_PORT = 8772 From 250ccaf7649848cb08af1f71528d0913f7ab01fe Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:41:33 -0700 Subject: [PATCH 084/140] Fixed model created response code. --- tds/modules/model/controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tds/modules/model/controller.py b/tds/modules/model/controller.py index 49fe459a0..dc5b0d782 100644 --- a/tds/modules/model/controller.py +++ b/tds/modules/model/controller.py @@ -120,7 +120,7 @@ def model_post(payload: Model) -> JSONResponse: res = payload.create() logger.info("new model created: %s", res["_id"]) return JSONResponse( - status_code=status.HTTP_200_OK, + status_code=status.HTTP_201_CREATED, headers={ "content-type": "application/json", }, From d86d95d95cd4c1cfb0193e04a8b7221cce76e28e Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:42:02 -0700 Subject: [PATCH 085/140] Fixed model tests. --- tests/Model/test_model.py | 50 ++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/tests/Model/test_model.py b/tests/Model/test_model.py index 904f35f3d..249cc7220 100644 --- a/tests/Model/test_model.py +++ b/tests/Model/test_model.py @@ -1,14 +1,24 @@ """ Model test for TDS. """ +import os + +import pytest +from sqlalchemy import create_engine + +from tds.db.base import Base class TestModelEndpoints: _model_id = None - def test_post( - self, _mock_elasticsearch, fast_api_fixture, fast_api_test_url, model_json - ): + def setup_class(self): + sql_url = os.getenv("SQL_CONN_STR") + print(sql_url) + engine = create_engine(sql_url) + Base.metadata.create_all(engine) + + def test_post(self, fast_api_fixture, fast_api_test_url, model_json): response = fast_api_fixture.post( url=f"{fast_api_test_url}/models", json=model_json, @@ -16,37 +26,33 @@ def test_post( response_json = response.json() assert response.status_code == 201 assert "id" in response_json - self._model_id = response_json["id"] + pytest.model_id = response_json["id"] - def test_put( - self, _mock_elasticsearch, fast_api_fixture, fast_api_test_url, model_json - ): + def test_put(self, fast_api_fixture, fast_api_test_url, model_json): + print(pytest.model_id) put_data = model_json new_name = "{name} updated".format(name=model_json["name"]) - put_data["id"] = self._model_id + put_data["id"] = pytest.model_id put_data["name"] = new_name response = fast_api_fixture.put( - url=f"{fast_api_test_url}/models/{self._model_id}", + url=f"{fast_api_test_url}/models/{pytest.model_id}", json=put_data, ) response_json = response.json() + print(response_json) assert response.status_code == 200 - assert "id" in response_json and response_json["id"] == self._model_id + assert "id" in response_json and response_json["id"] == pytest.model_id - def test_get( - self, _mock_elasticsearch, fast_api_fixture, fast_api_test_url, model_json - ): + def test_get(self, fast_api_fixture, fast_api_test_url, model_json): response = fast_api_fixture.get( - url=f"{fast_api_test_url}/models/{self._model_id}", + url=f"{fast_api_test_url}/models/{pytest.model_id}", ) response_json = response.json() assert response.status_code == 200 - assert "id" in response_json and response_json["id"] == self._model_id + assert "id" in response_json and response_json["id"] == pytest.model_id assert "timestamp" in response_json - def test_post_fail( - self, _mock_elasticsearch, fast_api_fixture, fast_api_test_url, model_json - ): + def test_post_fail(self, fast_api_fixture, fast_api_test_url, model_json): fail_data = model_json del fail_data["name"] del fail_data["model"] @@ -58,9 +64,7 @@ def test_post_fail( assert response.status_code == 422 assert "detail" in response_json - def test_put_fail( - self, _mock_elasticsearch, fast_api_fixture, fast_api_test_url, model_json - ): + def test_put_fail(self, fast_api_fixture, fast_api_test_url, model_json): fail_data = model_json del fail_data["name"] del fail_data["model"] @@ -72,9 +76,7 @@ def test_put_fail( assert response.status_code == 422 assert "detail" in response_json - def test_get_fail( - self, _mock_elasticsearch, fast_api_fixture, fast_api_test_url, model_json - ): + def test_get_fail(self, fast_api_fixture, fast_api_test_url, model_json): response = fast_api_fixture.get( url=f"{fast_api_test_url}/models/id-does-not-exist", ) From 0782ce85d001b9c986ade589fe4e402804a189d1 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:42:28 -0700 Subject: [PATCH 086/140] Adding enum handler for migrations. --- migrate/scripts/enums.py | 110 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 migrate/scripts/enums.py diff --git a/migrate/scripts/enums.py b/migrate/scripts/enums.py new file mode 100644 index 000000000..60be03e81 --- /dev/null +++ b/migrate/scripts/enums.py @@ -0,0 +1,110 @@ +from typing import Iterator + +import sqlalchemy as sa +from alembic import op +from sqlalchemy import Column + +provenance_type = sa.Enum( + "Concept", + "Dataset", + "Model", + "ModelConfiguration", + "Project", + "Publication", + "Simulation", + name="provenancetype", +) +resource_type = sa.Enum( + "datasets", + "models", + "model_configurations", + "publications", + "simulations", + "workflows", + name="resourcetype", +) +extracted_type = sa.Enum("equation", "figure", "table", name="extractedtype") +taggable_type = sa.Enum( + "datasets", + "models", + "projects", + "publications", + "qualifiers", + "simulation_parameters", + "model_configurations", + "simulations", + "workflows", + name="taggabletype", +) +role = sa.Enum("author", "contributor", "maintainer", "other", name="role") +ontological_field = sa.Enum("obj", "unit", name="ontologicalfield") +relation_type = sa.Enum( + "BEGINS_AT", + "CITES", + "COMBINED_FROM", + "CONTAINS", + "COPIED_FROM", + "DECOMPOSED_FROM", + "DERIVED_FROM", + "EDITED_FROM", + "EQUIVALENT_OF", + "EXTRACTED_FROM", + "GENERATED_BY", + "GLUED_FROM", + "IS_CONCEPT_OF", + "PARAMETER_OF", + "REINTERPRETS", + "STRATIFIED_FROM", + "USES", + name="relationtype", +) + +value_type = sa.Enum("binary", "bool", "float", "int", "str", name="valuetype") + + +def update_enum(name: str, enum_obj: sa.Enum, cols: dict, enum_entities: list) -> None: + for key in cols: + if type(cols[key]) is list: + for col_key in cols[key]: + alter_enum_col(table_name=key, col_name=col_key) + else: + alter_enum_col(table_name=key, col_name=cols[key]) + drop_enums([enum_obj]) + new_enum = sa.Enum(*enum_entities, name=name) + for key_1 in cols: + if type(cols[key_1]) is list: + for col_key_1 in cols[key_1]: + convert_enum_col( + table_name=key_1, col_name=col_key_1, new_enum=new_enum + ) + else: + convert_enum_col(table_name=key_1, col_name=cols[key_1], new_enum=new_enum) + + +def alter_enum_col(table_name: str, col_name: str): + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + col_name, + existing_type=sa.Enum, + type=sa.String(), + ) + + +def convert_enum_col(table_name: str, col_name: str, new_enum: sa.Enum): + with op.batch_alter_table(table_name) as batch_op: + new_col = f"{col_name}_copy" + batch_op.add_column(column=Column(name=new_col, type_=new_enum)) + with op.batch_alter_table(table_name) as batch_op_2: + batch_op_2.execute(f"UPDATE {table_name} SET {new_col} = {col_name};") + batch_op_2.drop_column(col_name) + batch_op_2.alter_column(new_col, new_column_name=col_name) + + +# Alembic 1.9.4 does not support dropping enums on downgrade on autogen. So, +# ... we separate enum declarations from upgrade. +def drop_enums(enums: Iterator[sa.Enum]): + """ + Drop a list of enums + """ + for enum in enums: + enum.drop(op.get_bind(), checkfirst=True) From 58c0ec7777fa96885f5143b52d7cb44c0c201766 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:42:50 -0700 Subject: [PATCH 087/140] Adding test script. --- docker/scripts/tds_test.sh | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 docker/scripts/tds_test.sh diff --git a/docker/scripts/tds_test.sh b/docker/scripts/tds_test.sh new file mode 100644 index 000000000..079cb2286 --- /dev/null +++ b/docker/scripts/tds_test.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +alembic -c migrate/alembic.ini upgrade head +pytest tests/ +#touch /logger.log +#tail -f /logger.log \ No newline at end of file From b8c1b93b5128560f016f34f6261f0ba9e7c25334 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:43:06 -0700 Subject: [PATCH 088/140] Adding test docker file. --- docker/Dockerfile.test | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 docker/Dockerfile.test diff --git a/docker/Dockerfile.test b/docker/Dockerfile.test new file mode 100644 index 000000000..b09053b32 --- /dev/null +++ b/docker/Dockerfile.test @@ -0,0 +1,17 @@ +FROM python:3.10 +RUN apt update 2> /dev/null +RUN apt install -y postgresql postgresql-contrib sqlite3 +RUN pip install poetry +WORKDIR /api +ADD poetry.lock poetry.lock +ADD pyproject.toml pyproject.toml +RUN poetry config virtualenvs.create false +COPY tests tests +COPY tds tds +COPY tds /tds_package/tds +RUN find tds_package/tds/modules \! -name "model.py" -mindepth 2 -maxdepth 2 -print | xargs rm -rf +COPY graph_relations.json graph_relations.json + +COPY migrate migrate +COPY docker/scripts/tds_test.sh tds_test.sh +RUN poetry install From 9cfbb348e9c30a84f06dcd41e2fe1d0f7b6f0915 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:43:50 -0700 Subject: [PATCH 089/140] Adding test override file. --- .../docker-compose.testing.override.yml | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 docker/overrides/docker-compose.testing.override.yml diff --git a/docker/overrides/docker-compose.testing.override.yml b/docker/overrides/docker-compose.testing.override.yml new file mode 100644 index 000000000..1bf1e74f1 --- /dev/null +++ b/docker/overrides/docker-compose.testing.override.yml @@ -0,0 +1,21 @@ +version: "3.9" +services: + api: + container_name: data-service-api-testing + build: + context: ./ + dockerfile: docker/Dockerfile.test + ports: + - "8001:8000" + env_file: + - api.env + environment: + - NEO4J_ENABLED + - SQL_URL="" + depends_on: + elasticsearch: + condition: service_healthy + volumes: + - $PWD/tests:/api/tests + - $PWD/tds:/api/tds + - $PWD/migrate:/api/migrate \ No newline at end of file From 386cf630c1de0a9389e17e7cc1d05870a78a48fa Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:44:44 -0700 Subject: [PATCH 090/140] Adding override file to ignore. --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a2fb18a89..e29ea539d 100644 --- a/.gitignore +++ b/.gitignore @@ -34,4 +34,5 @@ api.env # Minio .minio.sys data/askem-staging-data-service -migrate/seeds/files/*.csv \ No newline at end of file +migrate/seeds/files/*.csv +docker-compose.override.yml \ No newline at end of file From cc6de4364e1bc220f0bf7829317e940d53652b3f Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 12:45:09 -0700 Subject: [PATCH 091/140] Fixed naming to match modules. --- tests/{Model => model}/conftest.py | 0 tests/{Model => model}/test_model.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename tests/{Model => model}/conftest.py (100%) rename tests/{Model => model}/test_model.py (100%) diff --git a/tests/Model/conftest.py b/tests/model/conftest.py similarity index 100% rename from tests/Model/conftest.py rename to tests/model/conftest.py diff --git a/tests/Model/test_model.py b/tests/model/test_model.py similarity index 100% rename from tests/Model/test_model.py rename to tests/model/test_model.py From d0f6e70837937aad519ba863b1a9fa854772178e Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 13:03:53 -0700 Subject: [PATCH 092/140] Finished cleaning up model test. --- tests/model/test_model.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/tests/model/test_model.py b/tests/model/test_model.py index 249cc7220..aa2c139dd 100644 --- a/tests/model/test_model.py +++ b/tests/model/test_model.py @@ -10,14 +10,6 @@ class TestModelEndpoints: - _model_id = None - - def setup_class(self): - sql_url = os.getenv("SQL_CONN_STR") - print(sql_url) - engine = create_engine(sql_url) - Base.metadata.create_all(engine) - def test_post(self, fast_api_fixture, fast_api_test_url, model_json): response = fast_api_fixture.post( url=f"{fast_api_test_url}/models", @@ -29,7 +21,6 @@ def test_post(self, fast_api_fixture, fast_api_test_url, model_json): pytest.model_id = response_json["id"] def test_put(self, fast_api_fixture, fast_api_test_url, model_json): - print(pytest.model_id) put_data = model_json new_name = "{name} updated".format(name=model_json["name"]) put_data["id"] = pytest.model_id @@ -39,7 +30,6 @@ def test_put(self, fast_api_fixture, fast_api_test_url, model_json): json=put_data, ) response_json = response.json() - print(response_json) assert response.status_code == 200 assert "id" in response_json and response_json["id"] == pytest.model_id @@ -48,9 +38,11 @@ def test_get(self, fast_api_fixture, fast_api_test_url, model_json): url=f"{fast_api_test_url}/models/{pytest.model_id}", ) response_json = response.json() + new_name = "{name} updated".format(name=model_json["name"]) assert response.status_code == 200 assert "id" in response_json and response_json["id"] == pytest.model_id assert "timestamp" in response_json + assert "name" in response_json and response_json["name"] == new_name def test_post_fail(self, fast_api_fixture, fast_api_test_url, model_json): fail_data = model_json @@ -69,14 +61,14 @@ def test_put_fail(self, fast_api_fixture, fast_api_test_url, model_json): del fail_data["name"] del fail_data["model"] response = fast_api_fixture.put( - url=f"{fast_api_test_url}/models/{self._model_id}", + url=f"{fast_api_test_url}/models/{pytest.model_id}", json=model_json, ) response_json = response.json() assert response.status_code == 422 assert "detail" in response_json - def test_get_fail(self, fast_api_fixture, fast_api_test_url, model_json): + def test_get_fail(self, fast_api_fixture, fast_api_test_url): response = fast_api_fixture.get( url=f"{fast_api_test_url}/models/id-does-not-exist", ) From dbdf020f69e5d15f9c9d934aa93290540f27e310 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 13:55:17 -0700 Subject: [PATCH 093/140] Updated test env. --- docker/overrides/docker-compose.testing.override.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docker/overrides/docker-compose.testing.override.yml b/docker/overrides/docker-compose.testing.override.yml index 1bf1e74f1..58f4890ca 100644 --- a/docker/overrides/docker-compose.testing.override.yml +++ b/docker/overrides/docker-compose.testing.override.yml @@ -11,7 +11,9 @@ services: - api.env environment: - NEO4J_ENABLED - - SQL_URL="" + - SQL_CONN_STR=sqlite:///test.db + - SEED_DATA=false + - SQL_NOW_STATEMENT='CURRENT_TIMESTAMP' depends_on: elasticsearch: condition: service_healthy From a4393df09444b2208df18b7f3fae8a109c38278e Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 13:55:38 -0700 Subject: [PATCH 094/140] Fixed put response in model configurations. --- tds/modules/model_configuration/controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tds/modules/model_configuration/controller.py b/tds/modules/model_configuration/controller.py index a0b59c5c1..580511248 100644 --- a/tds/modules/model_configuration/controller.py +++ b/tds/modules/model_configuration/controller.py @@ -56,7 +56,7 @@ def model_configuration_post(payload: ModelConfiguration) -> JSONResponse: res = payload.save() logger.info("New model_configuration created: %s", res["_id"]) return JSONResponse( - status_code=status.HTTP_200_OK, + status_code=status.HTTP_201_CREATED, headers={ "content-type": "application/json", }, From 3832a6f7e8c8124c7755a94089685296fa8dd4ca Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 13:56:06 -0700 Subject: [PATCH 095/140] Fixed post response in workflows. --- tds/modules/workflow/controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tds/modules/workflow/controller.py b/tds/modules/workflow/controller.py index 69aa0007f..e19d90e9d 100644 --- a/tds/modules/workflow/controller.py +++ b/tds/modules/workflow/controller.py @@ -49,7 +49,7 @@ def workflow_post(payload: Workflow) -> JSONResponse: res = payload.save() logger.info("New workflow created: %s", res["_id"]) return JSONResponse( - status_code=status.HTTP_200_OK, + status_code=status.HTTP_201_CREATED, headers={ "content-type": "application/json", }, From 3e1bfc90d4ecdb4e051e02eeb82801cd9f8b4552 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 13:56:21 -0700 Subject: [PATCH 096/140] Fixed put response in projects. --- tds/modules/project/controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tds/modules/project/controller.py b/tds/modules/project/controller.py index 1164ccb19..965fbb920 100644 --- a/tds/modules/project/controller.py +++ b/tds/modules/project/controller.py @@ -144,7 +144,7 @@ def project_put( logger.info("new project created: %i", project_id) return JSONResponse( - status_code=status.HTTP_202_ACCEPTED, + status_code=status.HTTP_200_OK, headers={"content-type": "application/json"}, content={"id": project_id}, ) From 722dab85bbefd383411b164b9c3f6d9a71d9217d Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 13:56:59 -0700 Subject: [PATCH 097/140] Adding additional tests. --- tests/model_configuration/conftest.py | 583 ++++++++++++++++++ .../test_model_configuration.py | 79 +++ tests/project/conftest.py | 13 + tests/project/test_project.py | 73 +++ tests/workflow/conftest.py | 12 + tests/workflow/test_workflow.py | 77 +++ 6 files changed, 837 insertions(+) create mode 100644 tests/model_configuration/conftest.py create mode 100644 tests/model_configuration/test_model_configuration.py create mode 100644 tests/project/conftest.py create mode 100644 tests/project/test_project.py create mode 100644 tests/workflow/conftest.py create mode 100644 tests/workflow/test_workflow.py diff --git a/tests/model_configuration/conftest.py b/tests/model_configuration/conftest.py new file mode 100644 index 000000000..5cc632216 --- /dev/null +++ b/tests/model_configuration/conftest.py @@ -0,0 +1,583 @@ +import pytest +from pytest import fixture + + +@fixture() +def model_config_json(): + return { + "name": "SIR Model Config", + "description": "SIR model configuration", + "model_id": pytest.model_id, + "model_version": "1.0", + "configuration": { + "name": "SIR Model", + "username": "Adam Smith", + "schema": "https://raw.githubusercontent.com/DARPA-ASKEM/Model-Representations/petrinet_v0.5/petrinet/petrinet_schema.json", + "description": "SIR model", + "schema_name": "petrinet", + "model_version": "0.1", + "model": { + "states": [ + { + "id": "S", + "name": "Susceptible", + "description": "Number of individuals that are 'susceptible' to a disease infection", + "grounding": {"identifiers": {"ido": "0000514"}}, + "units": { + "expression": "person", + "expression_mathml": "person", + }, + }, + { + "id": "I", + "name": "Infected", + "description": "Number of individuals that are 'infected' by a disease", + "grounding": {"identifiers": {"ido": "0000511"}}, + "units": { + "expression": "person", + "expression_mathml": "person", + }, + }, + { + "id": "R", + "name": "Recovered", + "description": "Number of individuals that have 'recovered' from a disease infection", + "grounding": {"identifiers": {"ido": "0000592"}}, + "units": { + "expression": "person", + "expression_mathml": "person", + }, + }, + ], + "transitions": [ + { + "id": "inf", + "input": ["S", "I"], + "output": ["I", "I"], + "properties": { + "name": "Infection", + "description": "Infective process between individuals", + }, + }, + { + "id": "rec", + "input": ["I"], + "output": ["R"], + "properties": { + "name": "Recovery", + "description": "Recovery process of a infected individual", + }, + }, + ], + }, + "semantics": { + "ode": { + "rates": [ + { + "target": "inf", + "expression": "S*I*beta", + "expression_mathml": "SIbeta", + }, + { + "target": "rec", + "expression": "I*gamma", + "expression_mathml": "Igamma", + }, + ], + "initials": [ + { + "target": "S", + "expression": "S0", + "expression_mathml": "S0", + }, + { + "target": "I", + "expression": "I0", + "expression_mathml": "I0", + }, + { + "target": "R", + "expression": "R0", + "expression_mathml": "R0", + }, + ], + "parameters": [ + { + "id": "beta", + "name": "β", + "description": "infection rate", + "units": { + "expression": "1/(person*day)", + "expression_mathml": "1personday", + }, + "value": 2.7e-7, + "distribution": { + "type": "Uniform1", + "parameters": {"minimum": 2.6e-7, "maximum": 2.8e-7}, + }, + }, + { + "id": "gamma", + "name": "γ", + "description": "recovery rate", + "grounding": {"identifiers": {"askemo": "0000013"}}, + "units": { + "expression": "1/day", + "expression_mathml": "1day", + }, + "value": 0.14, + "distribution": { + "type": "Uniform1", + "parameters": {"minimum": 0.1, "maximum": 0.18}, + }, + }, + { + "id": "S0", + "name": "S₀", + "description": "Total susceptible population at timestep 0", + "value": 1000, + }, + { + "id": "I0", + "name": "I₀", + "description": "Total infected population at timestep 0", + "value": 1, + }, + { + "id": "R0", + "name": "R₀", + "description": "Total recovered population at timestep 0", + "value": 0, + }, + ], + "observables": [ + { + "id": "noninf", + "name": "Non-infectious", + "states": ["S", "R"], + "expression": "S+R", + "expression_mathml": "SR", + } + ], + "time": { + "id": "t", + "units": { + "expression": "day", + "expression_mathml": "day", + }, + }, + } + }, + "metadata": { + "attributes": [ + { + "type": "anchored_extraction", + "payload": { + "id": {"id": "R:190348269"}, + "names": [ + { + "id": {"id": "T:-1709799622"}, + "name": "Bucky", + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 738, + "char_end": 743, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.974474", + }, + } + ], + "descriptions": [ + { + "id": {"id": "T:-486841659"}, + "source": "time", + "grounding": [ + { + "grounding_text": "time since time scale zero", + "grounding_id": "apollosv:00000272", + "source": [], + "score": 0.8945620059967041, + "provenance": { + "method": "SKEMA-TR-Embedding", + "timestamp": "2023-06-15T22:59:11.974644", + }, + } + ], + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 732, + "char_end": 736, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.974474", + }, + } + ], + "value_specs": [], + "groundings": [], + }, + }, + { + "type": "anchored_extraction", + "payload": { + "id": {"id": "R:159895595"}, + "names": [ + { + "id": {"id": "T:2131207786"}, + "name": "SEIR", + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 56, + "char_end": 60, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.974780", + }, + } + ], + "descriptions": [ + { + "id": {"id": "T:-1520869470"}, + "source": "spatially distributed", + "grounding": [], + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 34, + "char_end": 55, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.974780", + }, + } + ], + "value_specs": [], + "groundings": [], + }, + }, + { + "type": "anchored_extraction", + "payload": { + "id": {"id": "E:-337831219"}, + "names": [ + { + "id": {"id": "T:1326919589"}, + "name": "S", + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 562, + "char_end": 563, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.974931", + }, + } + ], + "descriptions": [ + { + "id": {"id": "T:1687413640"}, + "source": "fraction of the population", + "grounding": [ + { + "grounding_text": "count of simulated population", + "grounding_id": "apollosv:00000022", + "source": [], + "score": 0.8330355286598206, + "provenance": { + "method": "SKEMA-TR-Embedding", + "timestamp": "2023-06-15T22:59:11.975009", + }, + } + ], + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 570, + "char_end": 596, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.974931", + }, + } + ], + "value_specs": [], + "groundings": [ + { + "grounding_text": "Meruvax I", + "grounding_id": "vo:0003109", + "source": [], + "score": 0.7847759127616882, + "provenance": { + "method": "SKEMA-TR-Embedding", + "timestamp": "2023-06-15T22:59:11.974960", + }, + } + ], + }, + }, + { + "type": "anchored_extraction", + "payload": { + "id": {"id": "E:-1921441554"}, + "names": [ + { + "id": {"id": "T:-24678027"}, + "name": "asym frac", + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 142, + "char_end": 151, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.975127", + }, + }, + { + "id": {"id": "v10"}, + "name": "\u03b1", + "extraction_source": None, + "provenance": { + "method": "MIT extractor V1.0 - text, dataset, formula annotation (chunwei@mit.edu)", + "timestamp": "2023-06-15T22:59:13.177022", + }, + }, + ], + "descriptions": [ + { + "id": {"id": "T:1244663286"}, + "source": "percentage of infections", + "grounding": [ + { + "grounding_text": "percentage of cases", + "grounding_id": "cemo:percentage_of_cases", + "source": [], + "score": 0.8812347650527954, + "provenance": { + "method": "SKEMA-TR-Embedding", + "timestamp": "2023-06-15T22:59:11.975201", + }, + } + ], + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 94, + "char_end": 118, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.975127", + }, + }, + { + "id": {"id": "v10"}, + "source": " Rate of infections that are asymptomatic", + "grounding": None, + "extraction_source": None, + "provenance": { + "method": "MIT extractor V1.0 - text, dataset, formula annotation (chunwei@mit.edu)", + "timestamp": "2023-06-15T22:59:13.177022", + }, + }, + ], + "value_specs": [], + "groundings": [ + { + "grounding_text": "Van", + "grounding_id": "geonames:298117", + "source": [], + "score": 1.0, + "provenance": { + "method": "MIT extractor V1.0 - text, dataset, formula annotation (chunwei@mit.edu)", + "timestamp": "2023-06-15T22:59:13.177022", + }, + }, + { + "grounding_text": "Sanaa", + "grounding_id": "geonames:71137", + "source": [], + "score": 1.0, + "provenance": { + "method": "MIT extractor V1.0 - text, dataset, formula annotation (chunwei@mit.edu)", + "timestamp": "2023-06-15T22:59:13.177022", + }, + }, + ], + }, + }, + { + "type": "anchored_extraction", + "payload": { + "id": {"id": "E:392549189"}, + "names": [ + { + "id": {"id": "T:-24678027"}, + "name": "asym frac", + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 142, + "char_end": 151, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.975270", + }, + }, + { + "id": {"id": "v18"}, + "name": "asym_frac", + "extraction_source": None, + "provenance": { + "method": "MIT extractor V1.0 - text, dataset, formula annotation (chunwei@mit.edu)", + "timestamp": "2023-06-15T22:59:13.177022", + }, + }, + ], + "descriptions": [ + { + "id": {"id": "T:1244663286"}, + "source": "percentage of infections", + "grounding": [ + { + "grounding_text": "percentage of cases", + "grounding_id": "cemo:percentage_of_cases", + "source": [], + "score": 0.8812347650527954, + "provenance": { + "method": "SKEMA-TR-Embedding", + "timestamp": "2023-06-15T22:59:11.975340", + }, + } + ], + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 94, + "char_end": 118, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.975270", + }, + }, + { + "id": {"id": "v18"}, + "source": " Fraction of infections that are asymptomatic", + "grounding": None, + "extraction_source": None, + "provenance": { + "method": "MIT extractor V1.0 - text, dataset, formula annotation (chunwei@mit.edu)", + "timestamp": "2023-06-15T22:59:13.177022", + }, + }, + ], + "value_specs": [], + "groundings": [], + }, + }, + { + "type": "anchored_extraction", + "payload": { + "id": {"id": "E:-1790112729"}, + "names": [ + { + "id": {"id": "T:-24678027"}, + "name": "asym frac", + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 142, + "char_end": 151, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.975409", + }, + } + ], + "descriptions": [ + { + "id": {"id": "T:1244663286"}, + "source": "percentage of infections", + "grounding": [ + { + "grounding_text": "percentage of cases", + "grounding_id": "cemo:percentage_of_cases", + "source": [], + "score": 0.8812347650527954, + "provenance": { + "method": "SKEMA-TR-Embedding", + "timestamp": "2023-06-15T22:59:11.975479", + }, + } + ], + "extraction_source": { + "page": 0, + "block": 0, + "char_start": 94, + "char_end": 118, + "document_reference": { + "id": "buckymodel_webdocs.pdf" + }, + }, + "provenance": { + "method": "Skema TR Pipeline rules", + "timestamp": "2023-06-15T22:59:11.975409", + }, + } + ], + "value_specs": [], + "groundings": [], + }, + }, + ] + }, + }, + } diff --git a/tests/model_configuration/test_model_configuration.py b/tests/model_configuration/test_model_configuration.py new file mode 100644 index 000000000..5e863ad12 --- /dev/null +++ b/tests/model_configuration/test_model_configuration.py @@ -0,0 +1,79 @@ +""" +Model test for TDS. +""" +import os + +import pytest +from sqlalchemy import create_engine + +from tds.db.base import Base + + +class TestModelConfigurationEndpoints: + def test_post(self, fast_api_fixture, fast_api_test_url, model_config_json): + response = fast_api_fixture.post( + url=f"{fast_api_test_url}/model_configurations", + json=model_config_json, + ) + response_json = response.json() + assert response.status_code == 201 + assert "id" in response_json + pytest.model_configuration_id = response_json["id"] + + def test_put(self, fast_api_fixture, fast_api_test_url, model_config_json): + put_data = model_config_json + new_name = "{name} updated".format(name=model_config_json["name"]) + put_data["id"] = pytest.model_configuration_id + put_data["name"] = new_name + response = fast_api_fixture.put( + url=f"{fast_api_test_url}/model_configurations/{pytest.model_configuration_id}", + json=put_data, + ) + response_json = response.json() + assert response.status_code == 200 + assert ( + "id" in response_json + and response_json["id"] == pytest.model_configuration_id + ) + + def test_get(self, fast_api_fixture, fast_api_test_url): + response = fast_api_fixture.get( + url=f"{fast_api_test_url}/model_configurations/{pytest.model_configuration_id}", + ) + response_json = response.json() + assert response.status_code == 200 + assert ( + "id" in response_json + and response_json["id"] == pytest.model_configuration_id + ) + assert "timestamp" in response_json + + def test_post_fail(self, fast_api_fixture, fast_api_test_url, model_config_json): + fail_data = model_config_json + del fail_data["name"] + del fail_data["configuration"] + response = fast_api_fixture.post( + url=f"{fast_api_test_url}/model_configurations", + json=model_config_json, + ) + response_json = response.json() + assert response.status_code == 422 + assert "detail" in response_json + + def test_put_fail(self, fast_api_fixture, fast_api_test_url, model_config_json): + fail_data = model_config_json + del fail_data["name"] + del fail_data["configuration"] + response = fast_api_fixture.put( + url=f"{fast_api_test_url}/model_configurations/{pytest.model_configuration_id}", + json=model_config_json, + ) + response_json = response.json() + assert response.status_code == 422 + assert "detail" in response_json + + def test_get_fail(self, fast_api_fixture, fast_api_test_url): + response = fast_api_fixture.get( + url=f"{fast_api_test_url}/model_configurations/id-does-not-exist", + ) + assert response.status_code == 404 diff --git a/tests/project/conftest.py b/tests/project/conftest.py new file mode 100644 index 000000000..940ca0ea9 --- /dev/null +++ b/tests/project/conftest.py @@ -0,0 +1,13 @@ +import pytest +from pytest import fixture + + +@fixture() +def project_json(): + return { + "name": "A cool project", + "description": "Project info goes here.", + "assets": {}, + "active": "true", + "username": "Loki", + } diff --git a/tests/project/test_project.py b/tests/project/test_project.py new file mode 100644 index 000000000..cba41b16f --- /dev/null +++ b/tests/project/test_project.py @@ -0,0 +1,73 @@ +""" +Model test for TDS. +""" +import os + +import pytest +from sqlalchemy import create_engine + +from tds.db.base import Base + + +class TestProjectEndpoints: + def test_post(self, fast_api_fixture, fast_api_test_url, project_json): + response = fast_api_fixture.post( + url=f"{fast_api_test_url}/projects", + json=project_json, + ) + response_json = response.json() + assert response.status_code == 201 + assert "id" in response_json + pytest.project_id = response_json["id"] + + def test_put(self, fast_api_fixture, fast_api_test_url, project_json): + put_data = project_json + new_name = "{name} updated".format(name=project_json["name"]) + put_data["id"] = pytest.project_id + put_data["name"] = new_name + response = fast_api_fixture.put( + url=f"{fast_api_test_url}/projects/{pytest.project_id}", + json=put_data, + ) + response_json = response.json() + assert response.status_code == 200 + assert "id" in response_json and response_json["id"] == pytest.project_id + + def test_get(self, fast_api_fixture, fast_api_test_url): + response = fast_api_fixture.get( + url=f"{fast_api_test_url}/projects/{pytest.project_id}", + ) + response_json = response.json() + assert response.status_code == 200 + assert "id" in response_json and response_json["id"] == pytest.project_id + assert "timestamp" in response_json + + def test_post_fail(self, fast_api_fixture, fast_api_test_url, project_json): + fail_data = project_json + del fail_data["name"] + del fail_data["active"] + response = fast_api_fixture.post( + url=f"{fast_api_test_url}/projects", + json=project_json, + ) + response_json = response.json() + assert response.status_code == 422 + assert "detail" in response_json + + def test_put_fail(self, fast_api_fixture, fast_api_test_url, project_json): + fail_data = project_json + del fail_data["name"] + del fail_data["active"] + response = fast_api_fixture.put( + url=f"{fast_api_test_url}/projects/{pytest.project_id}", + json=project_json, + ) + response_json = response.json() + assert response.status_code == 422 + assert "detail" in response_json + + def test_get_fail(self, fast_api_fixture, fast_api_test_url): + response = fast_api_fixture.get( + url=f"{fast_api_test_url}/projects/18202", + ) + assert response.status_code == 404 diff --git a/tests/workflow/conftest.py b/tests/workflow/conftest.py new file mode 100644 index 000000000..523d993d7 --- /dev/null +++ b/tests/workflow/conftest.py @@ -0,0 +1,12 @@ +from pytest import fixture + + +@fixture() +def workflow_json(): + return { + "name": "Test Workflow", + "description": "This is the description", + "edges": [{"id": "edge"}], + "transform": {"x": 124.932, "y": 48.65, "k": 3.1}, + "nodes": [], + } diff --git a/tests/workflow/test_workflow.py b/tests/workflow/test_workflow.py new file mode 100644 index 000000000..9121cc0b4 --- /dev/null +++ b/tests/workflow/test_workflow.py @@ -0,0 +1,77 @@ +""" +Model test for TDS. +""" +import os + +import pytest +from sqlalchemy import create_engine + +from tds.db.base import Base + + +class TestWorkflowEndpoints: + def test_post(self, fast_api_fixture, fast_api_test_url, workflow_json): + response = fast_api_fixture.post( + url=f"{fast_api_test_url}/workflows", + json=workflow_json, + ) + response_json = response.json() + assert response.status_code == 201 + assert "id" in response_json + pytest.model_id = response_json["id"] + + def test_put(self, fast_api_fixture, fast_api_test_url, workflow_json): + put_data = workflow_json + new_name = "{name} updated".format(name=workflow_json["name"]) + put_data["id"] = pytest.model_id + put_data["name"] = new_name + response = fast_api_fixture.put( + url=f"{fast_api_test_url}/workflows/{pytest.model_id}", + json=put_data, + ) + response_json = response.json() + assert response.status_code == 200 + assert "id" in response_json and response_json["id"] == pytest.model_id + + def test_get(self, fast_api_fixture, fast_api_test_url, workflow_json): + response = fast_api_fixture.get( + url=f"{fast_api_test_url}/workflows/{pytest.model_id}", + ) + response_json = response.json() + new_name = "{name} updated".format(name=workflow_json["name"]) + assert response.status_code == 200 + assert "id" in response_json and response_json["id"] == pytest.model_id + assert "timestamp" in response_json + assert "name" in response_json and response_json["name"] == new_name + + def test_post_fail(self, fast_api_fixture, fast_api_test_url, workflow_json): + fail_data = workflow_json + del fail_data["name"] + del fail_data["transform"] + del fail_data["nodes"] + response = fast_api_fixture.post( + url=f"{fast_api_test_url}/workflows", + json=workflow_json, + ) + response_json = response.json() + assert response.status_code == 422 + assert "detail" in response_json + + def test_put_fail(self, fast_api_fixture, fast_api_test_url, workflow_json): + fail_data = workflow_json + del fail_data["name"] + del fail_data["transform"] + del fail_data["nodes"] + response = fast_api_fixture.put( + url=f"{fast_api_test_url}/workflows/{pytest.model_id}", + json=workflow_json, + ) + response_json = response.json() + assert response.status_code == 422 + assert "detail" in response_json + + def test_get_fail(self, fast_api_fixture, fast_api_test_url): + response = fast_api_fixture.get( + url=f"{fast_api_test_url}/workflows/id-does-not-exist", + ) + assert response.status_code == 404 From 2297952d2e836e3562f99c7f11651c48d9fc2392 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 14:43:16 -0700 Subject: [PATCH 098/140] Fixing linter issue. --- tds/db/relational.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tds/db/relational.py b/tds/db/relational.py index f7f6df781..6337c79d5 100644 --- a/tds/db/relational.py +++ b/tds/db/relational.py @@ -7,12 +7,12 @@ from tds.settings import settings # pylint: disable-next=line-too-long -sql_url = f"{settings.SQL_PROTOCOL}://{settings.SQL_USER}:{settings.SQL_PASSWORD}@{settings.SQL_URL}:{settings.SQL_PORT}/{settings.SQL_DB}" +SQL_URL = f"{settings.SQL_PROTOCOL}://{settings.SQL_USER}:{settings.SQL_PASSWORD}@{settings.SQL_URL}:{settings.SQL_PORT}/{settings.SQL_DB}" sql_args = {"pool_size": 25, "max_overflow": 10, "connect_args": {"connect_timeout": 8}} if settings.SQL_CONN_STR: - sql_url = settings.SQL_CONN_STR + SQL_URL = settings.SQL_CONN_STR sql_args = {} -engine = create_engine(sql_url, **sql_args) +engine = create_engine(SQL_URL, **sql_args) async def request_engine(): From a2677221344f3b7220a824f53d0302a00e98bf13 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 15:31:35 -0700 Subject: [PATCH 099/140] Moving pytest to own workflow. --- .github/workflows/correctness.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/correctness.yaml b/.github/workflows/correctness.yaml index c20965cf5..47781c36c 100644 --- a/.github/workflows/correctness.yaml +++ b/.github/workflows/correctness.yaml @@ -25,5 +25,3 @@ jobs: run: poetry run pylint ./tds - name: Pylint alembic run: poetry run pylint ./migrate - - name: Pytest - run: poetry run pytest From 15082c82b9135a62d349a9723007350f2357ee83 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 15:32:19 -0700 Subject: [PATCH 100/140] Adding test workflow. --- .github/workflows/test.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/test.yaml diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 000000000..7d7d7d3b8 --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,19 @@ +--- +name: Correctness +on: + workflow_call: + push: + branches: ['main'] + pull_request: + branches: ['main'] + +jobs: + test: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v1 + - name: Start containers + run: docker-compose --env-file api.env.sample -f "docker-compose.yml" -f "docker/overrides/docker-compose.testing.override.yml" --profile tds-testing up -d --build + - name: Stop containers + if: always() + run: docker-compose --env-file api.env.sample -f "docker-compose.yml" -f "docker/overrides/docker-compose.testing.override.yml" --profile tds-testing down \ No newline at end of file From 387afdfeee2b479ea2a7398a4cc5c86d82636985 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 15:32:50 -0700 Subject: [PATCH 101/140] Fixed workflow title. --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 7d7d7d3b8..f26b99303 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,5 +1,5 @@ --- -name: Correctness +name: Testing on: workflow_call: push: From e968b41954898c7afb30cba4c4cda9f31f8956f2 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 15:34:31 -0700 Subject: [PATCH 102/140] More tweaks. --- .github/workflows/test.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index f26b99303..0a790b364 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -12,8 +12,11 @@ jobs: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v1 + - name: Set up test. + run: | + cp api.env.sample api.env - name: Start containers - run: docker-compose --env-file api.env.sample -f "docker-compose.yml" -f "docker/overrides/docker-compose.testing.override.yml" --profile tds-testing up -d --build + run: docker-compose --env-file api.env -f "docker-compose.yml" -f "docker/overrides/docker-compose.testing.override.yml" --profile tds-testing up -d --build - name: Stop containers if: always() - run: docker-compose --env-file api.env.sample -f "docker-compose.yml" -f "docker/overrides/docker-compose.testing.override.yml" --profile tds-testing down \ No newline at end of file + run: docker-compose --env-file api.env -f "docker-compose.yml" -f "docker/overrides/docker-compose.testing.override.yml" --profile tds-testing down \ No newline at end of file From f33b60429a60bd7f182437b8bfa05357001a6d09 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 15:40:33 -0700 Subject: [PATCH 103/140] Setting up override. --- .github/workflows/test.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 0a790b364..8f84b8e6b 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -15,8 +15,9 @@ jobs: - name: Set up test. run: | cp api.env.sample api.env + cp docker/overrides/docker-compose.testing.override.yml docker-compose.override.yml - name: Start containers - run: docker-compose --env-file api.env -f "docker-compose.yml" -f "docker/overrides/docker-compose.testing.override.yml" --profile tds-testing up -d --build + run: docker-compose --env-file api.env --profile tds-testing up -d --build - name: Stop containers if: always() - run: docker-compose --env-file api.env -f "docker-compose.yml" -f "docker/overrides/docker-compose.testing.override.yml" --profile tds-testing down \ No newline at end of file + run: docker-compose --env-file api.env --profile tds-testing down \ No newline at end of file From 0f49036d9c9021d099f10cf031ca0b05183e6026 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 15:48:01 -0700 Subject: [PATCH 104/140] Cleaning up docker compose. Moving local services to override. --- docker-compose.yml | 85 ---------------------------------------------- 1 file changed, 85 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 79603a191..7e2dac4fe 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,25 +7,6 @@ networks: driver: bridge name: data-annotation-stack services: - rdb: - profiles: ["tds-api", "local"] - container_name: data-service-rdb - image: "postgres:15.1" - ports: - - 8032:$SQL_PORT - environment: - - POSTGRES_PASSWORD=$SQL_PASSWORD - - POSTGRES_USER=$SQL_USER - - POSTGRES_DB=$SQL_DB - volumes: - - tds_data:/var/lib/postgresql/data - networks: - - data-api - healthcheck: - test: [ "CMD-SHELL", "pg_isready -U ${SQL_USER} -d ${SQL_DB}" ] - interval: 10s - timeout: 5s - retries: 5 api: container_name: data-service-api build: @@ -47,45 +28,6 @@ services: condition: service_started minio: condition: service_started - volumes: - - $PWD/tds:/api/tds - - $PWD/migrate:/api/migrate - graphdb: - profiles: ["tds-api", "local"] - build: - context: ./ - dockerfile: docker/Dockerfile.neo4j - ports: - - 7474:7474 - - 7687:7687 - environment: - - NEO4J_AUTH=$NEO4J_AUTH - - NEO4J_dbms_memory_pagecache_size=512M - volumes: - - neo4j_data:/data - depends_on: - rdb: - condition: service_healthy - migrations: - condition: service_completed_successfully - networks: - - data-api - minio: - profiles: ["local"] - build: - context: ./ - dockerfile: docker/Dockerfile.minio - environment: - MINIO_ROOT_USER: $MINIO_USER - MINIO_ROOT_PASSWORD: $MINIO_PWD - ports: - - 9000:9000 - - 9001:9001 - volumes: - - $PWD/data:/data - networks: - - data-api - - data-annotation-stack elasticsearch: profiles: ["local", "tds-testing"] image: elasticsearch:${STACK_VERSION} @@ -106,24 +48,6 @@ services: interval: 10s timeout: 20s retries: 5 - kibana: - profiles: ["local"] - depends_on: - - elasticsearch - image: docker.elastic.co/kibana/kibana:${STACK_VERSION} - volumes: - - kibanadata:/usr/share/kibana/data - ports: - - ${KIBANA_PORT}:5601 - environment: - - SERVERNAME=kibana - - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 - - ELASTICSEARCH_USERNAME=kibana_system - - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD} - mem_limit: ${MEM_LIMIT} - networks: - - data-api - - data-annotation-stack migrations: profiles: ["tds-api-only", "tds-api", "local"] container_name: data-service-migrations @@ -133,15 +57,6 @@ services: entrypoint: /run_migrations.sh env_file: - api.env -# volumes: -# - $PWD/migrate:/migrate - depends_on: - rdb: - condition: service_healthy - elasticsearch: - condition: service_healthy - minio: - condition: service_started networks: - data-api volumes: From da8a65b86db7df707a593855d18b64fbe03009f5 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 15:48:13 -0700 Subject: [PATCH 105/140] Adding local override. --- .../docker-compose.local.override.yml | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 docker/overrides/docker-compose.local.override.yml diff --git a/docker/overrides/docker-compose.local.override.yml b/docker/overrides/docker-compose.local.override.yml new file mode 100644 index 000000000..86f80ffe0 --- /dev/null +++ b/docker/overrides/docker-compose.local.override.yml @@ -0,0 +1,97 @@ +version: "3.9" +services: + rdb: + profiles: [ "tds-api", "local" ] + container_name: data-service-rdb + image: "postgres:15.1" + ports: + - 8032:$SQL_PORT + environment: + - POSTGRES_PASSWORD=$SQL_PASSWORD + - POSTGRES_USER=$SQL_USER + - POSTGRES_DB=$SQL_DB + volumes: + - tds_data:/var/lib/postgresql/data + networks: + - data-api + healthcheck: + test: [ "CMD-SHELL", "pg_isready -U ${SQL_USER} -d ${SQL_DB}" ] + interval: 10s + timeout: 5s + retries: 5 + minio: + profiles: [ "local" ] + build: + context: ./ + dockerfile: docker/Dockerfile.minio + environment: + MINIO_ROOT_USER: $MINIO_USER + MINIO_ROOT_PASSWORD: $MINIO_PWD + ports: + - 9000:9000 + - 9001:9001 + volumes: + - $PWD/data:/data + networks: + - data-api + - data-annotation-stack + graphdb: + profiles: [ "tds-api", "local" ] + build: + context: ./ + dockerfile: docker/Dockerfile.neo4j + ports: + - 7474:7474 + - 7687:7687 + environment: + - NEO4J_AUTH=$NEO4J_AUTH + - NEO4J_dbms_memory_pagecache_size=512M + volumes: + - neo4j_data:/data + depends_on: + rdb: + condition: service_healthy + migrations: + condition: service_completed_successfully + networks: + - data-api + migrations: + depends_on: + rdb: + condition: service_healthy + elasticsearch: + condition: service_healthy + minio: + condition: service_started + volumes: + - $PWD/migrate:/migrate + api: + depends_on: + migrations: + condition: service_completed_successfully + graphdb: + condition: service_started + minio: + condition: service_started + volumes: + - $PWD/tests:/api/tests + - $PWD/tds:/api/tds + - $PWD/migrate:/api/migrate + kibana: + profiles: [ "local" ] + depends_on: + - elasticsearch + image: docker.elastic.co/kibana/kibana:${STACK_VERSION} + volumes: + - kibanadata:/usr/share/kibana/data + ports: + - ${KIBANA_PORT}:5601 + environment: + - SERVERNAME=kibana + - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 + - ELASTICSEARCH_USERNAME=kibana_system + - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD} + mem_limit: ${MEM_LIMIT} + networks: + - data-api + - data-annotation-stack \ No newline at end of file From 3cd39ceb2101fff9b50153202b7ab2b06bf099a6 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 15:49:13 -0700 Subject: [PATCH 106/140] Removing local dependencies. --- docker-compose.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 7e2dac4fe..498e4b619 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,13 +21,6 @@ services: networks: - data-annotation-stack - data-api - depends_on: - migrations: - condition: service_completed_successfully - graphdb: - condition: service_started - minio: - condition: service_started elasticsearch: profiles: ["local", "tds-testing"] image: elasticsearch:${STACK_VERSION} From eeaa4eff5523b9bf42381aa6b9ef1d614620d259 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 15:54:21 -0700 Subject: [PATCH 107/140] Removed mounts. --- docker/overrides/docker-compose.testing.override.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docker/overrides/docker-compose.testing.override.yml b/docker/overrides/docker-compose.testing.override.yml index 58f4890ca..2b574ab4a 100644 --- a/docker/overrides/docker-compose.testing.override.yml +++ b/docker/overrides/docker-compose.testing.override.yml @@ -16,8 +16,4 @@ services: - SQL_NOW_STATEMENT='CURRENT_TIMESTAMP' depends_on: elasticsearch: - condition: service_healthy - volumes: - - $PWD/tests:/api/tests - - $PWD/tds:/api/tds - - $PWD/migrate:/api/migrate \ No newline at end of file + condition: service_healthy \ No newline at end of file From 2af4d92d5a21547246e4262c9f6b1ec1768b3b68 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 15:54:33 -0700 Subject: [PATCH 108/140] Added exit flag to compose job. --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 8f84b8e6b..cc05025e3 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -17,7 +17,7 @@ jobs: cp api.env.sample api.env cp docker/overrides/docker-compose.testing.override.yml docker-compose.override.yml - name: Start containers - run: docker-compose --env-file api.env --profile tds-testing up -d --build + run: docker-compose --env-file api.env --profile tds-testing up --abort-on-container-exit --build - name: Stop containers if: always() run: docker-compose --env-file api.env --profile tds-testing down \ No newline at end of file From 98fbc33cb41fca1be4fa549cc92487d60da25c03 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 17:08:48 -0700 Subject: [PATCH 109/140] Cleaned up test override. --- docker/overrides/docker-compose.testing.override.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docker/overrides/docker-compose.testing.override.yml b/docker/overrides/docker-compose.testing.override.yml index 2b574ab4a..70977c2b6 100644 --- a/docker/overrides/docker-compose.testing.override.yml +++ b/docker/overrides/docker-compose.testing.override.yml @@ -1,14 +1,6 @@ version: "3.9" services: api: - container_name: data-service-api-testing - build: - context: ./ - dockerfile: docker/Dockerfile.test - ports: - - "8001:8000" - env_file: - - api.env environment: - NEO4J_ENABLED - SQL_CONN_STR=sqlite:///test.db From 13b57715dc97b9234f17ba3c1b70e49938b38d5d Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 17:09:16 -0700 Subject: [PATCH 110/140] Increased ES timeout. --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 498e4b619..77f6e4fe9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -39,8 +39,8 @@ services: healthcheck: test: curl http://localhost:9200/_cluster/health?wait_for_status=yellow || exit 1 interval: 10s - timeout: 20s - retries: 5 + timeout: 60s + retries: 6 migrations: profiles: ["tds-api-only", "tds-api", "local"] container_name: data-service-migrations From b754ccaac51c395b14af79a501598245e4613d21 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 17:12:27 -0700 Subject: [PATCH 111/140] Fixed the stuff I should not have removed. --- docker/overrides/docker-compose.testing.override.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docker/overrides/docker-compose.testing.override.yml b/docker/overrides/docker-compose.testing.override.yml index 70977c2b6..963b17079 100644 --- a/docker/overrides/docker-compose.testing.override.yml +++ b/docker/overrides/docker-compose.testing.override.yml @@ -1,6 +1,10 @@ version: "3.9" services: api: + container_name: data-service-api-testing + build: + context: ./ + dockerfile: docker/Dockerfile.test environment: - NEO4J_ENABLED - SQL_CONN_STR=sqlite:///test.db From 0059e966d9c936efc9a8196aff155d39c24a3a38 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 17:17:12 -0700 Subject: [PATCH 112/140] Updated timeout for ES again. --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 77f6e4fe9..2c670eb46 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -38,9 +38,9 @@ services: - data-api healthcheck: test: curl http://localhost:9200/_cluster/health?wait_for_status=yellow || exit 1 - interval: 10s + interval: 20s timeout: 60s - retries: 6 + retries: 10 migrations: profiles: ["tds-api-only", "tds-api", "local"] container_name: data-service-migrations From 8fdd6ffe2c31840fce39a9211a52405f8997c376 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 17:23:43 -0700 Subject: [PATCH 113/140] Another timeout test. --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 2c670eb46..10418e17d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -38,8 +38,8 @@ services: - data-api healthcheck: test: curl http://localhost:9200/_cluster/health?wait_for_status=yellow || exit 1 - interval: 20s - timeout: 60s + interval: 30s + timeout: 180s retries: 10 migrations: profiles: ["tds-api-only", "tds-api", "local"] From 5aea311b7eb603c840be993acd31c69fb4670d2b Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 17:24:04 -0700 Subject: [PATCH 114/140] Added ES volume to local override. --- docker/overrides/docker-compose.local.override.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docker/overrides/docker-compose.local.override.yml b/docker/overrides/docker-compose.local.override.yml index 86f80ffe0..a092b9ab6 100644 --- a/docker/overrides/docker-compose.local.override.yml +++ b/docker/overrides/docker-compose.local.override.yml @@ -77,6 +77,9 @@ services: - $PWD/tests:/api/tests - $PWD/tds:/api/tds - $PWD/migrate:/api/migrate + elasticsearch: + volumes: + - elasticsearch_data:/usr/share/elasticsearch/data kibana: profiles: [ "local" ] depends_on: From 1a20021f9ee95ec3fd1345c3996afcd8a6a8aac8 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 17:24:22 -0700 Subject: [PATCH 115/140] Added ES index auto create option for testing. --- docker/overrides/docker-compose.testing.override.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docker/overrides/docker-compose.testing.override.yml b/docker/overrides/docker-compose.testing.override.yml index 963b17079..47e5e87ff 100644 --- a/docker/overrides/docker-compose.testing.override.yml +++ b/docker/overrides/docker-compose.testing.override.yml @@ -12,4 +12,7 @@ services: - SQL_NOW_STATEMENT='CURRENT_TIMESTAMP' depends_on: elasticsearch: - condition: service_healthy \ No newline at end of file + condition: service_healthy + elasticsearch: + environment: + - action.auto_create_index=true \ No newline at end of file From ea6a2995e00e38fee55faf1a9c235cdba531d62d Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 17:28:46 -0700 Subject: [PATCH 116/140] Added test init. --- docker/overrides/docker-compose.testing.override.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docker/overrides/docker-compose.testing.override.yml b/docker/overrides/docker-compose.testing.override.yml index 47e5e87ff..13bea6510 100644 --- a/docker/overrides/docker-compose.testing.override.yml +++ b/docker/overrides/docker-compose.testing.override.yml @@ -13,6 +13,8 @@ services: depends_on: elasticsearch: condition: service_healthy + entrypoint: ["bash", "/api/tds_test.sh"] elasticsearch: environment: - - action.auto_create_index=true \ No newline at end of file + - action.auto_create_index=true + - ingest.geoip.downloader.enabled=false \ No newline at end of file From edf97c5afd9a35362a3ce2e03d8a944ca0171ac1 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 17:33:58 -0700 Subject: [PATCH 117/140] Added TDS_HOST_PORT to sample env. --- api.env.sample | 1 + 1 file changed, 1 insertion(+) diff --git a/api.env.sample b/api.env.sample index b1edb5d87..560830921 100644 --- a/api.env.sample +++ b/api.env.sample @@ -1,3 +1,4 @@ +TDS_HOST_PORT=8001 SQL_URL=rdb SQL_PORT=5432 SQL_USER=dev From 625039733d3b0de31b5ffddf84fcb40e9ad51dec Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 17:43:34 -0700 Subject: [PATCH 118/140] Added additional test props to set up. --- tests/conftest.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 622f981ea..e1a86679f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -11,6 +11,9 @@ def pytest_configure(): pytest.model_id = None + pytest.project_id = None + pytest.model_configuration_id = None + pytest.workflow_id = None @fixture(autouse=True) From a51c10c9342e77295fe5f959a668b8214b334c6c Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 17:43:49 -0700 Subject: [PATCH 119/140] Fixed workflow test. --- tests/workflow/test_workflow.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/workflow/test_workflow.py b/tests/workflow/test_workflow.py index 9121cc0b4..32d7db322 100644 --- a/tests/workflow/test_workflow.py +++ b/tests/workflow/test_workflow.py @@ -18,29 +18,29 @@ def test_post(self, fast_api_fixture, fast_api_test_url, workflow_json): response_json = response.json() assert response.status_code == 201 assert "id" in response_json - pytest.model_id = response_json["id"] + pytest.workflow_id = response_json["id"] def test_put(self, fast_api_fixture, fast_api_test_url, workflow_json): put_data = workflow_json new_name = "{name} updated".format(name=workflow_json["name"]) - put_data["id"] = pytest.model_id + put_data["id"] = pytest.workflow_id put_data["name"] = new_name response = fast_api_fixture.put( - url=f"{fast_api_test_url}/workflows/{pytest.model_id}", + url=f"{fast_api_test_url}/workflows/{pytest.workflow_id}", json=put_data, ) response_json = response.json() assert response.status_code == 200 - assert "id" in response_json and response_json["id"] == pytest.model_id + assert "id" in response_json and response_json["id"] == pytest.workflow_id def test_get(self, fast_api_fixture, fast_api_test_url, workflow_json): response = fast_api_fixture.get( - url=f"{fast_api_test_url}/workflows/{pytest.model_id}", + url=f"{fast_api_test_url}/workflows/{pytest.workflow_id}", ) response_json = response.json() new_name = "{name} updated".format(name=workflow_json["name"]) assert response.status_code == 200 - assert "id" in response_json and response_json["id"] == pytest.model_id + assert "id" in response_json and response_json["id"] == pytest.workflow_id assert "timestamp" in response_json assert "name" in response_json and response_json["name"] == new_name @@ -63,7 +63,7 @@ def test_put_fail(self, fast_api_fixture, fast_api_test_url, workflow_json): del fail_data["transform"] del fail_data["nodes"] response = fast_api_fixture.put( - url=f"{fast_api_test_url}/workflows/{pytest.model_id}", + url=f"{fast_api_test_url}/workflows/{pytest.workflow_id}", json=workflow_json, ) response_json = response.json() From 3b0d9dce3fcef81b300f639c6e9ca37081b8e5e8 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 17:44:03 -0700 Subject: [PATCH 120/140] Added ES init to test flow. --- docker/scripts/tds_test.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/scripts/tds_test.sh b/docker/scripts/tds_test.sh index 079cb2286..5c6b02635 100644 --- a/docker/scripts/tds_test.sh +++ b/docker/scripts/tds_test.sh @@ -1,6 +1,7 @@ #!/usr/bin/env bash alembic -c migrate/alembic.ini upgrade head +python migrate/scripts/start_elasticsearch.py pytest tests/ #touch /logger.log #tail -f /logger.log \ No newline at end of file From 421e3e7083fce1e787cc592bb3a571d2dafbc589 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 17:51:24 -0700 Subject: [PATCH 121/140] Added check for failed tests. --- .github/workflows/test.yaml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index cc05025e3..63748f082 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -17,7 +17,13 @@ jobs: cp api.env.sample api.env cp docker/overrides/docker-compose.testing.override.yml docker-compose.override.yml - name: Start containers - run: docker-compose --env-file api.env --profile tds-testing up --abort-on-container-exit --build + run: | + docker-compose --env-file api.env --profile tds-testing up --abort-on-container-exit --build + export TEST=$(docker logs data-service-api-testing | tail -n 1) + if [[ "$TEST" == *"failed"* ]] ; then + exit(1) + fi + - name: Stop containers if: always() run: docker-compose --env-file api.env --profile tds-testing down \ No newline at end of file From 0625d0f9ba2d20073910ad42b4cbca896db553b0 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 18:05:42 -0700 Subject: [PATCH 122/140] Reverted timeout increase. --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 10418e17d..adf55a1af 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -38,8 +38,8 @@ services: - data-api healthcheck: test: curl http://localhost:9200/_cluster/health?wait_for_status=yellow || exit 1 - interval: 30s - timeout: 180s + interval: 10s + timeout: 10s retries: 10 migrations: profiles: ["tds-api-only", "tds-api", "local"] From d2f86557b3034a87760b2ca132a04d43f3ad6fb4 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 18:05:53 -0700 Subject: [PATCH 123/140] Fixed quote issue. --- docker/overrides/docker-compose.testing.override.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/overrides/docker-compose.testing.override.yml b/docker/overrides/docker-compose.testing.override.yml index 13bea6510..e6ae2be1b 100644 --- a/docker/overrides/docker-compose.testing.override.yml +++ b/docker/overrides/docker-compose.testing.override.yml @@ -9,7 +9,7 @@ services: - NEO4J_ENABLED - SQL_CONN_STR=sqlite:///test.db - SEED_DATA=false - - SQL_NOW_STATEMENT='CURRENT_TIMESTAMP' + - SQL_NOW_STATEMENT=CURRENT_TIMESTAMP depends_on: elasticsearch: condition: service_healthy From 8f5bc72fc73daf8c9301a253eb5b9d1bf6d92523 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 18:10:30 -0700 Subject: [PATCH 124/140] Removed unneeded fail check. --- .github/workflows/test.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 63748f082..070e861ea 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -19,10 +19,6 @@ jobs: - name: Start containers run: | docker-compose --env-file api.env --profile tds-testing up --abort-on-container-exit --build - export TEST=$(docker logs data-service-api-testing | tail -n 1) - if [[ "$TEST" == *"failed"* ]] ; then - exit(1) - fi - name: Stop containers if: always() From 55823b87abf0e7722c457b6606884f22c0e463ba Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 18:16:00 -0700 Subject: [PATCH 125/140] Cleaned up step names. --- .github/workflows/test.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 070e861ea..e0454d151 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -16,10 +16,10 @@ jobs: run: | cp api.env.sample api.env cp docker/overrides/docker-compose.testing.override.yml docker-compose.override.yml - - name: Start containers + - name: Run Test Suite run: | docker-compose --env-file api.env --profile tds-testing up --abort-on-container-exit --build - - name: Stop containers + - name: Clean Up if: always() run: docker-compose --env-file api.env --profile tds-testing down \ No newline at end of file From b8f2bc848395a62aeac22c5388a22e51ff69452c Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 18:17:27 -0700 Subject: [PATCH 126/140] Reimplented test step for publish. --- .github/workflows/publish.yaml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index bd992957f..326fdd8d1 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -18,6 +18,9 @@ jobs: formatting: uses: ./.github/workflows/formatting.yaml + test: + uses: ./.github/workflows/test.yaml + # Call the Tag Generator to generate an image tag to use tag-generator: uses: darpa-askem/.github/.github/workflows/tag-generator.yaml@main @@ -27,9 +30,9 @@ jobs: # Build and Publish all targets associated with specified group bake: needs: - # Temorarily remove these to allow build while we fix testing - # - correctness - # - formatting + - correctness + - formatting + - test - tag-generator uses: darpa-askem/.github/.github/workflows/bake-publish.yml@main with: From a47da296a27b011c04e29c0129885315cff462bd Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Tue, 8 Aug 2023 18:18:26 -0700 Subject: [PATCH 127/140] Unified names. --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index e0454d151..993ca62aa 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,5 +1,5 @@ --- -name: Testing +name: Test on: workflow_call: push: From 99ad5d681e80ea63ce97afd164e7f6a5a9416aa9 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 9 Aug 2023 07:39:33 -0700 Subject: [PATCH 128/140] Cleaned up duplicated items in testing override. --- docker/overrides/docker-compose.testing.override.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docker/overrides/docker-compose.testing.override.yml b/docker/overrides/docker-compose.testing.override.yml index e6ae2be1b..3a5cc2670 100644 --- a/docker/overrides/docker-compose.testing.override.yml +++ b/docker/overrides/docker-compose.testing.override.yml @@ -13,8 +13,4 @@ services: depends_on: elasticsearch: condition: service_healthy - entrypoint: ["bash", "/api/tds_test.sh"] - elasticsearch: - environment: - - action.auto_create_index=true - - ingest.geoip.downloader.enabled=false \ No newline at end of file + entrypoint: ["bash", "/api/tds_test.sh"] \ No newline at end of file From 6fc93920a2c377ade5a433c04ed4f52b271eba78 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 9 Aug 2023 08:56:26 -0700 Subject: [PATCH 129/140] Removing enum migration. --- .../1a3cf96fb50f_add_artifact_to_enums.py | 90 ------------------- 1 file changed, 90 deletions(-) delete mode 100644 migrate/versions/1a3cf96fb50f_add_artifact_to_enums.py diff --git a/migrate/versions/1a3cf96fb50f_add_artifact_to_enums.py b/migrate/versions/1a3cf96fb50f_add_artifact_to_enums.py deleted file mode 100644 index 25cb9ac5d..000000000 --- a/migrate/versions/1a3cf96fb50f_add_artifact_to_enums.py +++ /dev/null @@ -1,90 +0,0 @@ -"""Add artifact to enums. - -Revision ID: 1a3cf96fb50f -Revises: 895deab7e80c -Create Date: 2023-06-14 19:38:18.828648 - -""" -import sqlalchemy as sa - -# pylint: disable=no-member, invalid-name -from alembic import op - -from migrate.scripts.enums import ( - provenance_type, - resource_type, - taggable_type, - update_enum, -) - -# revision identifiers, used by Alembic. -revision = "1a3cf96fb50f" -down_revision = "895deab7e80c" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - resource_enums = { - "association": "resource_type", - "project_asset": "resource_type", - } - resource_list = [ - "datasets", - "models", - "model_configurations", - "publications", - "simulations", - "workflows", - "artifacts", - ] - update_enum( - name="resourcetype", - enum_obj=resource_type, - cols=resource_enums, - enum_entities=resource_list, - ) - taggable_enums = { - "ontology_concept": "type", - } - taggable_list = [ - "datasets", - "models", - "projects", - "publications", - "qualifiers", - "simulation_parameters", - "model_configurations", - "simulations", - "workflows", - "artifacts", - ] - update_enum( - name="taggabletype", - enum_obj=taggable_type, - cols=taggable_enums, - enum_entities=taggable_list, - ) - provenance_enums = { - "provenance": ["left_type", "right_type"], - } - provenance_list = [ - "Concept", - "Dataset", - "Model", - "ModelConfiguration", - "Project", - "Publication", - "Simulation", - "Artifact", - ] - update_enum( - name="provenancetype", - enum_obj=provenance_type, - cols=provenance_enums, - enum_entities=provenance_list, - ) - - -def downgrade() -> None: - pass From e1bf54a7b86c6e9e92d6a604cc723a610282bb02 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 9 Aug 2023 08:56:48 -0700 Subject: [PATCH 130/140] Minor enum update. --- migrate/scripts/enums.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/migrate/scripts/enums.py b/migrate/scripts/enums.py index 60be03e81..b08e7dd1a 100644 --- a/migrate/scripts/enums.py +++ b/migrate/scripts/enums.py @@ -64,11 +64,12 @@ def update_enum(name: str, enum_obj: sa.Enum, cols: dict, enum_entities: list) -> None: for key in cols: + print(key) if type(cols[key]) is list: for col_key in cols[key]: - alter_enum_col(table_name=key, col_name=col_key) + alter_enum_col(table_name=key, col_name=col_key, enum_obj=enum_obj) else: - alter_enum_col(table_name=key, col_name=cols[key]) + alter_enum_col(table_name=key, col_name=cols[key], enum_obj=enum_obj) drop_enums([enum_obj]) new_enum = sa.Enum(*enum_entities, name=name) for key_1 in cols: @@ -81,11 +82,11 @@ def update_enum(name: str, enum_obj: sa.Enum, cols: dict, enum_entities: list) - convert_enum_col(table_name=key_1, col_name=cols[key_1], new_enum=new_enum) -def alter_enum_col(table_name: str, col_name: str): +def alter_enum_col(table_name: str, col_name: str, enum_obj: sa.Enum): with op.batch_alter_table(table_name) as batch_op: batch_op.alter_column( col_name, - existing_type=sa.Enum, + existing_type=enum_obj, type=sa.String(), ) @@ -107,4 +108,4 @@ def drop_enums(enums: Iterator[sa.Enum]): Drop a list of enums """ for enum in enums: - enum.drop(op.get_bind(), checkfirst=True) + enum.drop(op.get_bind(), checkfirst=False) From 7b00bdb50be44bb5da10975cadc7604d5719cc98 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 9 Aug 2023 08:57:03 -0700 Subject: [PATCH 131/140] Added neo4j as migration dep. --- migrate/requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/migrate/requirements.txt b/migrate/requirements.txt index 55a6fbf6a..232687f9e 100644 --- a/migrate/requirements.txt +++ b/migrate/requirements.txt @@ -3,4 +3,5 @@ alembic>=1.9.4 elasticsearch==8.5.3 boto3==1.24 requests>=2.28.1 -pydantic>=1.10.2 \ No newline at end of file +pydantic==1.10.12 +neo4j==5.11.0 \ No newline at end of file From 2d54d7d642dfa6e9fe399272fb05aa9645bf288e Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 9 Aug 2023 08:57:22 -0700 Subject: [PATCH 132/140] Removed postgres enums. --- migrate/versions/1f5853959c65_init_db.py | 49 ++++++------------------ 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/migrate/versions/1f5853959c65_init_db.py b/migrate/versions/1f5853959c65_init_db.py index 4051dad15..31f8de94b 100644 --- a/migrate/versions/1f5853959c65_init_db.py +++ b/migrate/versions/1f5853959c65_init_db.py @@ -10,19 +10,6 @@ import sqlalchemy as sa from alembic import op -from sqlalchemy.dialects import postgresql - -from migrate.scripts.enums import ( - drop_enums, - extracted_type, - ontological_field, - provenance_type, - relation_type, - resource_type, - role, - taggable_type, - value_type, -) # revision identifiers, used by Alembic. revision = "1f5853959c65" @@ -104,12 +91,12 @@ def upgrade() -> None: sa.Column("resource_id", sa.Integer(), nullable=False), sa.Column( "resource_type", - resource_type, + sa.String(), nullable=True, ), sa.Column( "role", - role, + sa.String(), nullable=True, ), sa.ForeignKeyConstraint( @@ -125,7 +112,7 @@ def upgrade() -> None: sa.Column("publication_id", sa.Integer(), nullable=False), sa.Column( "type", - extracted_type, + sa.String(), nullable=False, ), sa.Column("data", sa.LargeBinary(), nullable=False), @@ -164,11 +151,11 @@ def upgrade() -> None: sa.Column("curie", sa.String(), nullable=False), sa.Column( "type", - taggable_type, + sa.String(), nullable=False, ), sa.Column("object_id", sa.Integer(), nullable=False), - sa.Column("status", ontological_field, nullable=False), + sa.Column("status", sa.String(), nullable=False), sa.ForeignKeyConstraint( ["curie"], ["active_concept.curie"], @@ -182,7 +169,7 @@ def upgrade() -> None: sa.Column("resource_id", sa.Integer(), nullable=False), sa.Column( "resource_type", - resource_type, + sa.String(), nullable=False, ), sa.Column("external_ref", sa.String(), nullable=True), @@ -203,19 +190,19 @@ def upgrade() -> None: ), sa.Column( "relation_type", - relation_type, + sa.String(), nullable=False, ), sa.Column("left", sa.Integer(), nullable=False), sa.Column( "left_type", - provenance_type, + sa.String(), nullable=False, ), sa.Column("right", sa.Integer(), nullable=False), sa.Column( "right_type", - provenance_type, + sa.String(), nullable=False, ), sa.Column("user_id", sa.Integer(), nullable=True), @@ -235,7 +222,7 @@ def upgrade() -> None: sa.Column("name", sa.String(), nullable=False), sa.Column( "value_type", - value_type, + sa.String(), nullable=False, ), sa.PrimaryKeyConstraint("id"), @@ -248,7 +235,7 @@ def upgrade() -> None: sa.Column("name", sa.String(), nullable=False), sa.Column( "value_type", - value_type, + sa.String(), nullable=False, ), sa.PrimaryKeyConstraint("id"), @@ -289,17 +276,3 @@ def downgrade() -> None: op.drop_table("person") op.drop_table("model_framework") op.drop_table("active_concept") - new_enums = iter( - ( - resource_type, - extracted_type, - taggable_type, - role, - ontological_field, - resource_type, - relation_type, - provenance_type, - value_type, - ) - ) - drop_enums(new_enums) From 475445ecadecf0a215b38fc28dcc6d9318628b5a Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 9 Aug 2023 08:57:43 -0700 Subject: [PATCH 133/140] Fixed base install in main dockerfile. --- docker/Dockerfile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index aac2da347..66c5f2251 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -6,11 +6,10 @@ WORKDIR /api ADD poetry.lock poetry.lock ADD pyproject.toml pyproject.toml RUN poetry config virtualenvs.create false -RUN poetry install --no-dev -COPY tds tds +COPY tds tds COPY graph_relations.json graph_relations.json +RUN mkdir /api/tests && touch /api/tests/test.py +RUN poetry install --no-dev -# Poetry complains if the README doesn't exist -COPY README.md README.md EXPOSE 8000 CMD ["poetry", "run", "tds"] From c3bae4349351a4de44a668c6b1758722c584cac5 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 9 Aug 2023 10:26:12 -0700 Subject: [PATCH 134/140] Fixed down version. --- migrate/versions/d6ec58f4fd9a_add_publication_metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migrate/versions/d6ec58f4fd9a_add_publication_metadata.py b/migrate/versions/d6ec58f4fd9a_add_publication_metadata.py index 7e86f6134..8e3463565 100644 --- a/migrate/versions/d6ec58f4fd9a_add_publication_metadata.py +++ b/migrate/versions/d6ec58f4fd9a_add_publication_metadata.py @@ -12,7 +12,7 @@ # revision identifiers, used by Alembic. revision = "d6ec58f4fd9a" -down_revision = "1a3cf96fb50f" +down_revision = "895deab7e80c" branch_labels = None depends_on = None From 9a2fc4d6381ae5780fa1a74e0daf5a8729e06d41 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 16 Aug 2023 07:35:50 -0700 Subject: [PATCH 135/140] Fixed pylint and test issues. --- tds/modules/code/controller.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tds/modules/code/controller.py b/tds/modules/code/controller.py index dbc285814..edb6c7894 100644 --- a/tds/modules/code/controller.py +++ b/tds/modules/code/controller.py @@ -6,7 +6,7 @@ from logging import Logger from elasticsearch import NotFoundError -from fastapi import APIRouter, Response, status +from fastapi import APIRouter, status from fastapi.encoders import jsonable_encoder from fastapi.responses import JSONResponse @@ -56,7 +56,7 @@ def code_post(payload: Code) -> JSONResponse: res = payload.save() logger.info("New code created: %s", res["_id"]) return JSONResponse( - status_code=status.HTTP_200_OK, + status_code=status.HTTP_201_CREATED, headers={ "content-type": "application/json", }, From e67823a6c567ddf6c58f797b617c814a222513d9 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 16 Aug 2023 07:36:04 -0700 Subject: [PATCH 136/140] Added code id to pytest. --- tests/conftest.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/conftest.py b/tests/conftest.py index e1a86679f..f3f1a728f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -14,6 +14,7 @@ def pytest_configure(): pytest.project_id = None pytest.model_configuration_id = None pytest.workflow_id = None + pytest.code_id = None @fixture(autouse=True) From 5f67e96b5db5c7e361ef1676751e201b6fb8df97 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 16 Aug 2023 07:40:19 -0700 Subject: [PATCH 137/140] Adding code tests. --- tests/code/conftest.py | 11 +++++++ tests/code/test_code.py | 70 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 tests/code/conftest.py create mode 100644 tests/code/test_code.py diff --git a/tests/code/conftest.py b/tests/code/conftest.py new file mode 100644 index 000000000..0395a2b08 --- /dev/null +++ b/tests/code/conftest.py @@ -0,0 +1,11 @@ +from pytest import fixture + + +@fixture() +def code_json(): + return { + "name": "Test Code Snippet", + "description": "A test code sample.", + "language": "python", + "filename": "test.py", + } diff --git a/tests/code/test_code.py b/tests/code/test_code.py new file mode 100644 index 000000000..2a376b9fe --- /dev/null +++ b/tests/code/test_code.py @@ -0,0 +1,70 @@ +""" +Code module test for TDS. +""" +import pytest + + +class TestCodeEndpoints: + def test_post(self, fast_api_fixture, fast_api_test_url, code_json): + response = fast_api_fixture.post( + url=f"{fast_api_test_url}/code", + json=code_json, + ) + response_json = response.json() + assert response.status_code == 201 + assert "id" in response_json + pytest.code_id = response_json["id"] + + def test_put(self, fast_api_fixture, fast_api_test_url, code_json): + put_data = code_json + new_name = "{name} updated".format(name=code_json["name"]) + put_data["id"] = pytest.code_id + put_data["name"] = new_name + response = fast_api_fixture.put( + url=f"{fast_api_test_url}/code/{pytest.code_id}", + json=put_data, + ) + response_json = response.json() + assert response.status_code == 200 + assert "id" in response_json and response_json["id"] == pytest.code_id + + def test_get(self, fast_api_fixture, fast_api_test_url, code_json): + response = fast_api_fixture.get( + url=f"{fast_api_test_url}/code/{pytest.code_id}", + ) + response_json = response.json() + new_name = "{name} updated".format(name=code_json["name"]) + assert response.status_code == 200 + assert "id" in response_json and response_json["id"] == pytest.code_id + assert "timestamp" in response_json + assert "name" in response_json and response_json["name"] == new_name + + def test_post_fail(self, fast_api_fixture, fast_api_test_url, code_json): + fail_data = code_json + del fail_data["name"] + del fail_data["filename"] + response = fast_api_fixture.post( + url=f"{fast_api_test_url}/code", + json=code_json, + ) + response_json = response.json() + assert response.status_code == 422 + assert "detail" in response_json + + def test_put_fail(self, fast_api_fixture, fast_api_test_url, code_json): + fail_data = code_json + del fail_data["name"] + del fail_data["filename"] + response = fast_api_fixture.put( + url=f"{fast_api_test_url}/code/{pytest.code_id}", + json=code_json, + ) + response_json = response.json() + assert response.status_code == 422 + assert "detail" in response_json + + def test_get_fail(self, fast_api_fixture, fast_api_test_url): + response = fast_api_fixture.get( + url=f"{fast_api_test_url}/code/id-does-not-exist", + ) + assert response.status_code == 404 From bed830e3cd230653419bccc7747106ca11831e77 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 16 Aug 2023 08:59:13 -0700 Subject: [PATCH 138/140] Added timestamp to code response. --- tds/modules/code/response.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tds/modules/code/response.py b/tds/modules/code/response.py index a54708e6a..4d8dccde6 100644 --- a/tds/modules/code/response.py +++ b/tds/modules/code/response.py @@ -1,6 +1,7 @@ """ TDS Code Response object. """ +from datetime import datetime from typing import Optional from pydantic import BaseModel From 25e54ede5d25d03e55b14c756f4be5b327e2a066 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 16 Aug 2023 08:59:24 -0700 Subject: [PATCH 139/140] Added timestamp to code response. --- tds/modules/code/response.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tds/modules/code/response.py b/tds/modules/code/response.py index 4d8dccde6..4db6afff2 100644 --- a/tds/modules/code/response.py +++ b/tds/modules/code/response.py @@ -19,6 +19,7 @@ class CodeResponse(BaseModel): description: str filename: str repo_url: str + timestamp: datetime language: ProgrammingLanguage metadata: Optional[dict] From db6c7a2618cc69c8a04f303b51ece30c9b2b08f5 Mon Sep 17 00:00:00 2001 From: Todd Roper Date: Wed, 16 Aug 2023 08:59:43 -0700 Subject: [PATCH 140/140] Added repo url to code test conf. --- tests/code/conftest.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/code/conftest.py b/tests/code/conftest.py index 0395a2b08..5daab60a9 100644 --- a/tests/code/conftest.py +++ b/tests/code/conftest.py @@ -6,6 +6,7 @@ def code_json(): return { "name": "Test Code Snippet", "description": "A test code sample.", + "repo_url": "", "language": "python", "filename": "test.py", }