From 64b67e9f53fe3a68c5dc59ce8c9149b8dd0e2a1e Mon Sep 17 00:00:00 2001 From: cmungall Date: Thu, 9 Jun 2022 10:20:42 -0700 Subject: [PATCH 1/2] major refactor --- docs/cli.rst | 27 + docs/index.rst | 15 +- docs/{intro => }/install.rst | 12 +- docs/intro/cli.rst | 147 -- docs/intro/index.rst | 11 - docs/introduction.rst | 45 +- docs/packages/annotators.rst | 21 + docs/packages/generalizers.rst | 22 + docs/packages/importers.rst | 27 + docs/packages/index.rst | 14 + poetry.lock | 1332 +++++++++++++---- pyproject.toml | 9 +- schema_automator/__init__.py | 3 + schema_automator/annotators/__init__.py | 2 + .../annotators/schema_annotator.py | 1 + schema_automator/cli.py | 255 ++++ schema_automator/dosdp/__init__.py | 1 + schema_automator/generalizers/__init__.py | 3 + .../csv_data_generalizer.py} | 154 +- schema_automator/generalizers/generalizer.py | 20 + .../json_instance_generalizer.py} | 52 +- .../rdf_data_generalizer.py} | 58 +- schema_automator/importers/__init__.py | 4 + .../importers/dosdp_import_engine.py | 10 +- schema_automator/importers/import_engine.py | 22 +- .../importers/infer_model_from_rdftab.py | 2 +- .../importers/jsonschema_import_engine.py | 15 +- .../importers/owl_import_engine.py | 46 +- schema_automator/jsonschema/__init__.py | 1 + schema_automator/utils/__init__.py | 1 + schema_automator/utils/instance_extractor.py | 207 +++ schema_automator/utils/schema_extractor.py | 57 + schema_automator/utils/schemautils.py | 27 +- tests/test_annotators/__init__.py | 0 .../test_jsonld_annotator.py | 0 .../test_schema_annotator.py | 2 +- tests/test_generalizers/__init__.py | 0 .../test_csv_data_generalizer.py} | 36 +- .../test_fk_inference.py | 21 +- .../test_from_robot_template.py | 16 +- .../test_json_data_generalizer.py} | 31 +- .../test_rdf_data_generalizer.py} | 21 +- tests/test_importers/__init__.py | 0 .../test_convert_shacl_owl_representation.py} | 16 +- .../test_dosdp_importer.py} | 2 +- .../test_from_owl_schemaorg.py | 0 .../test_jsonschema_importer.py} | 2 +- .../test_owl_importer.py} | 13 +- tests/test_sparql_import.py | 12 - tests/test_utils/__init__.py | 0 tests/test_utils/test_instance_extractor.py | 72 + 51 files changed, 2141 insertions(+), 726 deletions(-) create mode 100644 docs/cli.rst rename docs/{intro => }/install.rst (52%) delete mode 100644 docs/intro/cli.rst delete mode 100644 docs/intro/index.rst create mode 100644 docs/packages/annotators.rst create mode 100644 docs/packages/generalizers.rst create mode 100644 docs/packages/importers.rst create mode 100644 docs/packages/index.rst create mode 100644 schema_automator/__init__.py create mode 100644 schema_automator/annotators/__init__.py create mode 100644 schema_automator/cli.py create mode 100644 schema_automator/dosdp/__init__.py create mode 100644 schema_automator/generalizers/__init__.py rename schema_automator/{importers/csv_import_engine.py => generalizers/csv_data_generalizer.py} (86%) create mode 100644 schema_automator/generalizers/generalizer.py rename schema_automator/{importers/json_instance_import_engine.py => generalizers/json_instance_generalizer.py} (79%) rename schema_automator/{importers/rdf_instance_import_engine.py => generalizers/rdf_data_generalizer.py} (63%) create mode 100644 schema_automator/importers/__init__.py create mode 100644 schema_automator/jsonschema/__init__.py create mode 100644 schema_automator/utils/__init__.py create mode 100644 schema_automator/utils/instance_extractor.py create mode 100644 schema_automator/utils/schema_extractor.py create mode 100644 tests/test_annotators/__init__.py rename tests/{ => test_annotators}/test_jsonld_annotator.py (100%) rename tests/{ => test_annotators}/test_schema_annotator.py (94%) create mode 100644 tests/test_generalizers/__init__.py rename tests/{test_from_tsv.py => test_generalizers/test_csv_data_generalizer.py} (60%) rename tests/{ => test_generalizers}/test_fk_inference.py (72%) rename tests/{ => test_generalizers}/test_from_robot_template.py (71%) rename tests/{test_from_json.py => test_generalizers/test_json_data_generalizer.py} (62%) rename tests/{test_from_rdf.py => test_generalizers/test_rdf_data_generalizer.py} (52%) create mode 100644 tests/test_importers/__init__.py rename tests/{test_convert_shacl.py => test_importers/test_convert_shacl_owl_representation.py} (64%) rename tests/{test_dosdp.py => test_importers/test_dosdp_importer.py} (97%) rename tests/{ => test_importers}/test_from_owl_schemaorg.py (100%) rename tests/{test_from_jsonschema.py => test_importers/test_jsonschema_importer.py} (98%) rename tests/{test_from_owl.py => test_importers/test_owl_importer.py} (69%) delete mode 100644 tests/test_sparql_import.py create mode 100644 tests/test_utils/__init__.py create mode 100644 tests/test_utils/test_instance_extractor.py diff --git a/docs/cli.rst b/docs/cli.rst new file mode 100644 index 0000000..941633b --- /dev/null +++ b/docs/cli.rst @@ -0,0 +1,27 @@ +.. cli: + +Command Line +============ + +All Schema Automator functionality is available via the ``schemauto`` command + +Preamble +-------- + +.. warning :: + + Previous versions had specific commands like ``tsv2linkml`` these are now deprecated. + Instead these are now *subcommands* of the main ``schemauto`` command, and have been renamed. + +.. note :: + + we follow the `CLIG `_ guidelines as far as possible + +Main commands +--------- + +.. currentmodule:: schema_automator.cli + +.. click:: schema_automator.cli:main + :prog: schemauto + :show-nested: diff --git a/docs/index.rst b/docs/index.rst index 1a7bf67..dbabeeb 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,17 +1,16 @@ -.. Schema Automator documentation master file, created by - sphinx-quickstart on Fri Apr 22 13:19:04 2022. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to Schema Automator's documentation! +LinkML Schema Automator ============================================ +Schema Automator is a toolkit for bootstrapping and automatically enhancing LinkML schemas from a variety of sources + .. toctree:: - :maxdepth: 2 + :maxdepth: 3 :caption: Contents: introduction - intro/index + install + cli + packages/index Indices and tables diff --git a/docs/intro/install.rst b/docs/install.rst similarity index 52% rename from docs/intro/install.rst rename to docs/install.rst index ff1bbe7..c247ecd 100644 --- a/docs/intro/install.rst +++ b/docs/install.rst @@ -5,7 +5,11 @@ Installation .. code:: bash - chmod 755 environment.sh - . environment.sh - pip install -r requirements.txt - pip install -e . \ No newline at end of file + pip install schema-automator + +To check this works: + +.. code:: bash + + schemauto --help + diff --git a/docs/intro/cli.rst b/docs/intro/cli.rst deleted file mode 100644 index fbdddc9..0000000 --- a/docs/intro/cli.rst +++ /dev/null @@ -1,147 +0,0 @@ -Command Line Usage ------------------- - -Annotating Enums -~~~~~~~~~~~~~~~~ - -This toolkit allows automated annotation of LinkML enums, mapping text -strings to ontology terms. - -The command line tool ``annotate-enums`` takes a LinkML schema, with -enums and fills in the ``meaning`` slots. - -See the `annotators `__ folder for docs - -Converting TSVs -~~~~~~~~~~~~~~~ - -The ``tsv2linkml`` command infers a single-class schema from a TSV -datafile - -.. code:: bash - - tsv2linkml --help - Usage: tsv2linkml [OPTIONS] TSVFILE - - Infer a model from a TSV - - Options: - -o, --output TEXT Output file - -c, --class_name TEXT Core class name in schema - -n, --schema_name TEXT Schema name - -s, --sep TEXT separator - -E, --enum-columns TEXT column that is forced to be an enum - --robot / --no-robot set if the TSV is a ROBOT template - --help Show this message and exit. - -Example: - -.. code:: bash - - tsv2linkml tests/resources/biobank-specimens.tsv - -The ``tsvs2linkml`` command infers a multi-class schema from multiple -TSV datafiles - -.. code:: bash - - tsvs2linkml --help - Usage: tsvs2linkml [OPTIONS] [TSVFILES]... - - Infer a model from multiple TSVs - - Options: - -o, --output TEXT Output file - -n, --schema_name TEXT Schema name - -s, --sep TEXT separator - -E, --enum-columns TEXT column(s) that is forced to be an enum - --enum-mask-columns TEXT column(s) that are excluded from being enums - --max-enum-size INTEGER do not create an enum if more than max distinct - members - - --enum-threshold FLOAT if the number of distinct values / rows is less - than this, do not make an enum - - --robot / --no-robot set if the TSV is a ROBOT template - --help Show this message and exit. - -Converting OWL -~~~~~~~~~~~~~~ - -.. code:: bash - - owl2linkml --help - Usage: owl2linkml [OPTIONS] OWLFILE - - Infer a model from OWL Ontology - - Note: input must be in functional syntax - - Options: - -n, --name TEXT Schema name - --help Show this message and exit. - -Example: - -.. code:: bash - - owl2linkml -n prov tests/resources/prov.ofn > prov.yaml - -Note this works best on schema-style ontologies such as Prov - -**NOT** recommended for terminological-style ontologies such as OBO - -Converting RDF instance graphs -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code:: bash - - rdf2linkml --help - Usage: rdf2linkml [OPTIONS] RDFFILE - - Infer a model from RDF instance data - - Options: - -d, --dir TEXT [required] - --help Show this message and exit. - -Converting JSON Instance Data -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code:: bash - - jsondata2linkml --help - Usage: jsondata2linkml [OPTIONS] INPUT - - Infer a model from JSON instance data - - - - Options: - --container-class-name TEXT name of root class - -f, --format TEXT json or yaml (or json.gz or yaml.gz) - --omit-null / --no-omit-null if true, ignore null values - --help Show this message and exit. - -Converting JSON-Schema -~~~~~~~~~~~~~~~~~~~~~~ - -.. code:: bash - - jsonschema2linkml --help - Usage: jsonschema2linkml [OPTIONS] INPUT - - Infer a model from JSON Schema - - Options: - -n, --name TEXT ID of schema [required] - -f, --format TEXT JSON Schema format - yaml or json - -o, --output TEXT output path - --help Show this message and exit. - -jsonschema2linkml example -~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code:: bash - - poetry run jsonschema2linkml -n test-model -f yaml -o vrs-linkml.yaml cp tests/resources/jsonschema/vrs.schema.json \ No newline at end of file diff --git a/docs/intro/index.rst b/docs/intro/index.rst deleted file mode 100644 index 4b0d275..0000000 --- a/docs/intro/index.rst +++ /dev/null @@ -1,11 +0,0 @@ -.. _get started: - -Get Started -=============================== - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - - install - cli \ No newline at end of file diff --git a/docs/introduction.rst b/docs/introduction.rst index ebc8053..18f923e 100644 --- a/docs/introduction.rst +++ b/docs/introduction.rst @@ -1,29 +1,38 @@ LinkML Schema Automator ======================= -This is a toolkit that assists with: +This is a toolkit that assists with generating and enhancing schemas and data models from a variety +of sources. -1. Bootstrapping LinkML models from instance data +The primary end target is a `LinkML `_ schema, but the framework can be used +to generate JSON-Schema, SHACL, SQL DDL etc via the `LinkML Generator `_ framework. - - TSVs and spreadsheets - - SQLite databases - - RDF instance graphs +All functionality is available via a :ref:`cli`. In future there will be a web-based interface. +The functionality is also available by using the relevant Python :ref:`packages`. -2. Bootstrapping a LinkML model from a different schema representation - (i.e. opposite of a linkml.generator) +Generalization from Instance Data +--------------------------------- - - OWL (RDFS-like subset) - - TODO: JSON-Schema, XSD, ShEx, SHACL, SQL DDL, FHIR, Python - dataclasses/pydantic, etc +See :ref:`generalizers` -3. Using automated methods to enhance a model +Generalizers allow you to *bootstrap* a schema by generalizing from existing data files - - Using text mining and concept annotator APIs to enrich semantic - enums - - TODO: querying sparql endpoints to retrieve additional metadata +- TSVs and spreadsheets +- SQLite databases +- RDF instance graphs -These can be composed together. For example, run ``tsvs2linkml`` -followed by ``annotate-enums`` +Importing from alternative modeling framework +--------------------------------- + +See :ref:`importers` + +- OWL (but this only works for schema-style OWL) +- JSON-Schema + +In future other frameworks will be supported + +Annotating schemas +--------------------------------- + +See :ref:`annotators` -The toolkit is still experimental. It is intended as an aid to schema -creation rather than act as a formal conversion tool \ No newline at end of file diff --git a/docs/packages/annotators.rst b/docs/packages/annotators.rst new file mode 100644 index 0000000..67a5690 --- /dev/null +++ b/docs/packages/annotators.rst @@ -0,0 +1,21 @@ +.. annotators: + +Annotators +========= + +Importers take an existing schema and *annotate* it with information + +.. warning:: + + some of these methods will be refactored to use OAK, in which case the way in which + the Bioportal API key is set will change + +.. currentmodule:: schema_automator.annotators + +.. autoclass:: SchemaAnnotator + :members: create + +.. autoclass:: JsonLdAnnotator + :members: create + + diff --git a/docs/packages/generalizers.rst b/docs/packages/generalizers.rst new file mode 100644 index 0000000..2c281d3 --- /dev/null +++ b/docs/packages/generalizers.rst @@ -0,0 +1,22 @@ +.. generalizers: + +Generalizers +========= + +Generalizers take example data and *generalizes* to a schema + +.. warning:: + + Generalization is inherently a heuristic process, this should be viewed as a bootstrapping process + that *semi*-automates the creation of a new schema for you. + +.. currentmodule:: schema_automator.generalizers + +.. autoclass:: CsvDataGeneralizer + :members: create + +.. autoclass:: JsonDataGeneralizer + :members: create + +.. autoclass:: RdfDataGeneralizer + :members: create \ No newline at end of file diff --git a/docs/packages/importers.rst b/docs/packages/importers.rst new file mode 100644 index 0000000..8f2d55c --- /dev/null +++ b/docs/packages/importers.rst @@ -0,0 +1,27 @@ +.. importers: + +Importers +========= + +Importers take either a representation of a schema in a different language or example data and bootstraps a schema. + +Importers are the opposite of `Generalizers `_ in the core LinkML framework + +.. warning:: + + Generally importers take a *less expressive* language than LinkML and attempts to create the corresponding + LinkML schema. This may be less optimal than a hand-crafted schema. For example, when converting to a + representation that lacks `inheritance `_, no ``is_a`` slots + will be created. + +.. currentmodule:: schema_automator.importers + +.. autoclass:: JsonSchemaImportEngine + :members: create + +.. autoclass:: OwlImportEngine + :members: create + +.. autoclass:: DOSDPImportEngine + :members: create + diff --git a/docs/packages/index.rst b/docs/packages/index.rst new file mode 100644 index 0000000..3b0e99f --- /dev/null +++ b/docs/packages/index.rst @@ -0,0 +1,14 @@ +.. packages: + +Packages +======== + +The code is organized into different python *packages* + +.. toctree:: + :maxdepth: 3 + :caption: Contents: + + importers + generalizers + annotators diff --git a/poetry.lock b/poetry.lock index 608869c..882728e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,3 +1,34 @@ +[[package]] +name = "aiohttp" +version = "3.8.1" +description = "Async http client/server framework (asyncio)" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["aiodns", "brotli", "cchardet"] + +[[package]] +name = "aiosignal" +version = "1.2.0" +description = "aiosignal: a list of registered asynchronous callbacks" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +frozenlist = ">=1.1.0" + [[package]] name = "alabaster" version = "0.7.12" @@ -14,6 +45,14 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = "*" + [[package]] name = "argparse" version = "1.4.0" @@ -22,6 +61,14 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" +category = "main" +optional = false +python-versions = ">=3.6" + [[package]] name = "atomicwrites" version = "1.4.0" @@ -65,7 +112,7 @@ python-versions = "*" [[package]] name = "bioregistry" -version = "0.4.96" +version = "0.4.120" description = "Integrated registry of biological databases and nomenclatures" category = "main" optional = false @@ -81,7 +128,7 @@ tqdm = "*" [package.extras] align = ["pyyaml", "beautifulsoup4", "tabulate", "defusedxml"] -charts = ["matplotlib", "matplotlib-venn", "seaborn"] +charts = ["matplotlib", "matplotlib-venn", "seaborn", "pandas"] docs = ["sphinx", "sphinx-rtd-theme", "sphinx-click", "sphinx-autodoc-typehints", "sphinx-automodapi", "autodoc-pydantic"] export = ["pyyaml", "rdflib", "rdflib-jsonld"] gha = ["more-itertools"] @@ -107,11 +154,11 @@ dev = ["pip-tools (==6.5.1)", "pytest (==7.1.1)", "flake8 (==4.0.1)", "tox (==3. [[package]] name = "certifi" -version = "2021.10.8" +version = "2022.5.18.1" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "cffi" @@ -156,7 +203,7 @@ unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "8.1.2" +version = "8.1.3" description = "Composable command line interface toolkit" category = "main" optional = false @@ -197,7 +244,7 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] name = "cryptography" -version = "36.0.2" +version = "37.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false @@ -212,7 +259,7 @@ docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] sdist = ["setuptools_rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] [[package]] name = "decorator" @@ -236,6 +283,17 @@ wrapt = ">=1.10,<2" [package.extras] dev = ["tox", "bump2version (<1)", "sphinx (<2)", "importlib-metadata (<3)", "importlib-resources (<4)", "configparser (<5)", "sphinxcontrib-websupport (<2)", "zipp (<2)", "PyTest (<5)", "PyTest-Cov (<2.6)", "pytest", "pytest-cov"] +[[package]] +name = "deprecation" +version = "2.1.0" +description = "A library to handle automated deprecations" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +packaging = "*" + [[package]] name = "docopt" version = "0.6.2" @@ -260,6 +318,57 @@ category = "main" optional = false python-versions = ">=3.6" +[[package]] +name = "fastobo" +version = "0.11.1" +description = "Faultless AST for Open Biomedical Ontologies in Python." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "frozenlist" +version = "1.3.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "fsspec" +version = "2022.5.0" +description = "File-system specification" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +aiohttp = {version = "*", optional = true, markers = "extra == \"http\""} +requests = {version = "*", optional = true, markers = "extra == \"http\""} + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dropbox = ["dropboxdrivefs", "requests", "dropbox"] +entrypoints = ["importlib-metadata"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["requests", "aiohttp"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + [[package]] name = "funowl" version = "0.1.11" @@ -277,7 +386,7 @@ rfc3987 = "*" [[package]] name = "ghp-import" -version = "2.0.2" +version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." category = "main" optional = false @@ -339,7 +448,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" -version = "4.11.3" +version = "4.11.4" description = "Read metadata from Python packages" category = "main" optional = false @@ -355,7 +464,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [[package]] name = "inflect" -version = "5.5.2" +version = "5.6.0" description = "Correctly generate plurals, singular nouns, ordinals, indefinite articles; convert numbers to words" category = "main" optional = false @@ -398,7 +507,7 @@ trio = ["trio", "async-generator"] [[package]] name = "jinja2" -version = "3.1.1" +version = "3.1.2" description = "A very fast and expressive template engine." category = "main" optional = false @@ -410,6 +519,14 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "joblib" +version = "1.1.0" +description = "Lightweight pipelining with Python functions" +category = "main" +optional = false +python-versions = ">=3.6" + [[package]] name = "json-flattener" version = "0.1.9" @@ -478,7 +595,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "jsonschema" -version = "4.4.0" +version = "4.5.1" description = "An implementation of JSON Schema validation for Python" category = "main" optional = false @@ -494,7 +611,7 @@ format_nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "keyring" -version = "23.5.0" +version = "23.5.1" description = "Store and access your passwords safely." category = "main" optional = false @@ -507,12 +624,25 @@ pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_ SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] + +[[package]] +name = "lark" +version = "1.1.2" +description = "a modern parsing library" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +atomic_cache = ["atomicwrites"] +nearley = ["js2py"] +regex = ["regex"] [[package]] name = "linkml" -version = "1.2.8" +version = "1.2.11" description = "Linked Open Data Modeling Language" category = "main" optional = false @@ -529,7 +659,7 @@ jinja2 = "*" jsonasobj2 = ">=1.0.3,<2.0" jsonschema = ">=3.0.1" linkml-dataops = "*" -linkml-runtime = ">=1.2.4,<1.3.0" +linkml-runtime = ">=1.2.12,<1.3.0" myst-parser = "*" openpyxl = "*" pandas = "*" @@ -566,7 +696,7 @@ linkml-runtime = ">=1.1.6" [[package]] name = "linkml-runtime" -version = "1.2.7" +version = "1.2.17" description = "Runtime environment for LinkML, the Linked open data modeling language" category = "main" optional = false @@ -586,7 +716,7 @@ requests = "*" [[package]] name = "markdown" -version = "3.3.6" +version = "3.3.7" description = "Python implementation of Markdown." category = "main" optional = false @@ -693,6 +823,14 @@ python-versions = ">=3.7" [package.dependencies] click = "*" +[[package]] +name = "multidict" +version = "6.0.2" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.7" + [[package]] name = "myst-parser" version = "0.17.2" @@ -716,6 +854,21 @@ linkify = ["linkify-it-py (>=1.0,<2.0)"] rtd = ["ipython", "sphinx-book-theme", "sphinx-panels", "sphinxcontrib-bibtex (>=2.4,<3.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)", "sphinxcontrib.mermaid (>=0.7.1,<0.8.0)", "sphinxext-opengraph (>=0.6.3,<0.7.0)"] testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest (>=6,<7)", "pytest-cov", "pytest-regressions", "pytest-param-files (>=0.3.4,<0.4.0)"] +[[package]] +name = "networkx" +version = "2.8.2" +description = "Python package for creating and manipulating graphs and networks" +category = "main" +optional = false +python-versions = ">=3.8" + +[package.extras] +default = ["numpy (>=1.19)", "scipy (>=1.8)", "matplotlib (>=3.4)", "pandas (>=1.3)"] +developer = ["pre-commit (>=2.18)", "mypy (>=0.942)"] +doc = ["sphinx (>=4.5)", "pydata-sphinx-theme (>=0.8.1)", "sphinx-gallery (>=0.10)", "numpydoc (>=1.3)", "pillow (>=9.1)", "nb2plots (>=0.6)", "texext (>=0.6.6)"] +extra = ["lxml (>=4.6)", "pygraphviz (>=1.9)", "pydot (>=1.4.2)", "sympy (>=1.10)"] +test = ["pytest (>=7.1)", "pytest-cov (>=3.0)", "codecov (>=2.1)"] + [[package]] name = "num2words" version = "0.5.10" @@ -729,15 +882,53 @@ docopt = ">=0.6.2" [[package]] name = "numpy" -version = "1.22.3" +version = "1.22.4" description = "NumPy is the fundamental package for array computing with Python." category = "main" optional = false python-versions = ">=3.8" +[[package]] +name = "nxontology" +version = "0.4.1" +description = "NetworkX for ontologies" +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +fsspec = {version = "*", extras = ["http"]} +networkx = ">=2" +pronto = ">=2.4.0" + +[package.extras] +dev = ["fire", "pandas", "pre-commit", "pytest"] +viz = ["pygraphviz"] + +[[package]] +name = "oaklib" +version = "0.1.17" +description = "Ontology Access Kit: Python library for common ontology operations over a variety of backends" +category = "main" +optional = false +python-versions = ">=3.9,<4.0" + +[package.dependencies] +appdirs = ">=1.4.4,<2.0.0" +lark = ">=1.1.2,<2.0.0" +linkml-runtime = ">=1.1.9,<2.0.0" +networkx = ">=2.7.1,<3.0.0" +nxontology = ">=0.4.0,<0.5.0" +pronto = ">=2.4.5,<3.0.0" +ratelimit = ">=2.2.1,<3.0.0" +semsql = ">=0.1.3,<0.2.0" +SPARQLWrapper = "*" +SQLAlchemy = ">=1.4.32,<2.0.0" +sssom = ">=0.3.8,<0.4.0" + [[package]] name = "openpyxl" -version = "3.0.9" +version = "3.0.10" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" category = "main" optional = false @@ -778,6 +969,19 @@ pytz = ">=2020.1" [package.extras] test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] +[[package]] +name = "pandasql" +version = "0.7.3" +description = "sqldf for pandas" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +numpy = "*" +pandas = "*" +sqlalchemy = "*" + [[package]] name = "parse" version = "1.19.0" @@ -832,6 +1036,20 @@ requests = "*" [package.extras] test = ["pytest"] +[[package]] +name = "pronto" +version = "2.4.5" +description = "Python frontend to ontologies." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +chardet = ">=3.0,<5.0" +fastobo = ">=0.11.1,<0.12.0" +networkx = ">=2.3,<3.0" +python-dateutil = ">=2.8,<3.0" + [[package]] name = "psycopg2-binary" version = "2.9.3" @@ -858,8 +1076,8 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pydantic" -version = "1.9.0" -description = "Data validation and settings management using python 3.6 type hinting" +version = "1.9.1" +description = "Data validation and settings management using python type hints" category = "main" optional = false python-versions = ">=3.6.1" @@ -873,11 +1091,11 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" -version = "2.11.2" +version = "2.12.0" description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [[package]] name = "pyjsg" @@ -893,22 +1111,19 @@ jsonasobj = ">=1.2.1" [[package]] name = "pypandoc" -version = "1.7.5" +version = "1.8.1" description = "Thin wrapper for pandoc." category = "main" optional = false -python-versions = "^2.7 || ^3.6" +python-versions = ">=3.6" [[package]] name = "pyparsing" -version = "3.0.8" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" +version = "2.4.7" +description = "Python parsing module" category = "main" optional = false -python-versions = ">=3.6.8" - -[package.extras] -diagrams = ["railroad-diagrams", "jinja2"] +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "pyrsistent" @@ -955,7 +1170,7 @@ shexjsg = ">=0.8.1" [[package]] name = "pystow" -version = "0.4.2" +version = "0.4.3" description = "Easily pick a place to store data for your python package." category = "main" optional = false @@ -1053,6 +1268,14 @@ python-versions = "*" inflect = "*" num2words = "*" +[[package]] +name = "ratelimit" +version = "2.2.1" +description = "API rate limit decorator" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "rdflib" version = "6.0.2" @@ -1109,6 +1332,19 @@ Pygments = ">=2.5.1" [package.extras] md = ["cmarkgfm (>=0.8.0)"] +[[package]] +name = "recommonmark" +version = "0.7.1" +description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +commonmark = ">=0.8.1" +docutils = ">=0.11" +sphinx = ">=1.3.1" + [[package]] name = "requests" version = "2.27.1" @@ -1159,7 +1395,7 @@ python-versions = "*" [[package]] name = "rich" -version = "12.2.0" +version = "12.4.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" category = "main" optional = false @@ -1195,6 +1431,37 @@ category = "main" optional = false python-versions = ">=3.5" +[[package]] +name = "scikit-learn" +version = "1.1.1" +description = "A set of python modules for machine learning and data mining" +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +joblib = ">=1.0.0" +numpy = ">=1.17.3" +scipy = ">=1.3.2" +threadpoolctl = ">=2.0.0" + +[package.extras] +benchmark = ["matplotlib (>=3.1.2)", "pandas (>=1.0.5)", "memory-profiler (>=0.57.0)"] +docs = ["matplotlib (>=3.1.2)", "scikit-image (>=0.14.5)", "pandas (>=1.0.5)", "seaborn (>=0.9.0)", "memory-profiler (>=0.57.0)", "sphinx (>=4.0.1)", "sphinx-gallery (>=0.7.0)", "numpydoc (>=1.2.0)", "Pillow (>=7.1.2)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.1.2)", "scikit-image (>=0.14.5)", "pandas (>=1.0.5)", "seaborn (>=0.9.0)"] +tests = ["matplotlib (>=3.1.2)", "scikit-image (>=0.14.5)", "pandas (>=1.0.5)", "pytest (>=5.0.1)", "pytest-cov (>=2.9.0)", "flake8 (>=3.8.2)", "black (>=22.3.0)", "mypy (>=0.770)", "pyamg (>=4.0.0)", "numpydoc (>=1.2.0)"] + +[[package]] +name = "scipy" +version = "1.6.1" +description = "SciPy: Scientific Library for Python" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +numpy = ">=1.16.5" + [[package]] name = "secretstorage" version = "3.3.2" @@ -1207,6 +1474,19 @@ python-versions = ">=3.6" cryptography = ">=2.0" jeepney = ">=0.6" +[[package]] +name = "semsql" +version = "0.1.3" +description = "" +category = "main" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +click = ">=8.1.3,<9.0.0" +linkml = ">=1.2.10,<2.0.0" +SQLAlchemy-Utils = ">=0.38.2,<0.39.0" + [[package]] name = "shexjsg" version = "0.8.2" @@ -1410,7 +1690,7 @@ test = ["pytest"] [[package]] name = "sqlalchemy" -version = "1.4.35" +version = "1.4.36" description = "Database Abstraction Library" category = "main" optional = false @@ -1440,6 +1720,65 @@ postgresql_psycopg2cffi = ["psycopg2cffi"] pymysql = ["pymysql (<1)", "pymysql"] sqlcipher = ["sqlcipher3-binary"] +[[package]] +name = "sqlalchemy-utils" +version = "0.38.2" +description = "Various utility functions for SQLAlchemy." +category = "main" +optional = false +python-versions = "~=3.4" + +[package.dependencies] +six = "*" +SQLAlchemy = ">=1.0" + +[package.extras] +arrow = ["arrow (>=0.3.4)"] +babel = ["Babel (>=1.3)"] +color = ["colour (>=0.0.4)"] +encrypted = ["cryptography (>=0.6)"] +intervals = ["intervals (>=0.7.1)"] +password = ["passlib (>=1.6,<2.0)"] +pendulum = ["pendulum (>=2.0.5)"] +phone = ["phonenumbers (>=5.9.2)"] +test = ["pytest (>=2.7.1)", "Pygments (>=1.2)", "Jinja2 (>=2.3)", "docutils (>=0.10)", "flexmock (>=0.9.7)", "mock (==2.0.0)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pg8000 (>=1.12.4)", "pytz (>=2014.2)", "python-dateutil (>=2.6)", "pymysql", "flake8 (>=2.4.0)", "isort (>=4.2.2)", "pyodbc", "backports.zoneinfo"] +test_all = ["Babel (>=1.3)", "Jinja2 (>=2.3)", "Pygments (>=1.2)", "arrow (>=0.3.4)", "colour (>=0.0.4)", "cryptography (>=0.6)", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "furl (>=0.4.1)", "intervals (>=0.7.1)", "isort (>=4.2.2)", "mock (==2.0.0)", "passlib (>=1.6,<2.0)", "pendulum (>=2.0.5)", "pg8000 (>=1.12.4)", "phonenumbers (>=5.9.2)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil", "python-dateutil (>=2.6)", "pytz (>=2014.2)", "backports.zoneinfo"] +timezone = ["python-dateutil"] +url = ["furl (>=0.4.1)"] + +[[package]] +name = "sssom" +version = "0.3.11" +description = "Operations on SSSOM mapping tables" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +bioregistry = "*" +click = "*" +deprecation = "*" +linkml-runtime = ">=1.1.12" +networkx = "*" +numpy = "*" +pandas = "*" +pandasql = "*" +pyparsing = "2.4.7" +pyyaml = "*" +rdflib = ">=6" +recommonmark = ">=0.7" +scikit_learn = "*" +scipy = "*" +sparqlwrapper = "*" +validators = [ + "*", + ">=0.0", +] + +[package.extras] +docs = ["sphinx", "sphinx-rtd-theme", "sphinx-autodoc-typehints", "sphinx-click"] +test = ["pytest"] + [[package]] name = "strsimpy" version = "0.2.1" @@ -1448,6 +1787,14 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "threadpoolctl" +version = "3.1.0" +description = "threadpoolctl" +category = "main" +optional = false +python-versions = ">=3.6" + [[package]] name = "tomli" version = "2.0.1" @@ -1513,9 +1860,23 @@ brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +[[package]] +name = "validators" +version = "0.19.0" +description = "Python Data Validation for Humans™." +category = "main" +optional = false +python-versions = ">=3.4" + +[package.dependencies] +decorator = ">=3.4.0" + +[package.extras] +test = ["pytest (>=2.2.3)", "flake8 (>=2.4.0)", "isort (>=4.2.2)"] + [[package]] name = "watchdog" -version = "2.1.7" +version = "2.1.8" description = "Filesystem events monitoring" category = "main" optional = false @@ -1534,12 +1895,24 @@ python-versions = "*" [[package]] name = "wrapt" -version = "1.14.0" +version = "1.14.1" 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" +[[package]] +name = "yarl" +version = "1.7.2" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + [[package]] name = "zipp" version = "3.8.0" @@ -1558,9 +1931,87 @@ docs = [] [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "3bc3860e9dc0e22e8f3abebd0d59be7e46ff59d7f176da17c2e56c14675532d4" +content-hash = "83a99d4474d998ea062f39057ced63c428002bb2322b951d0152d2e1833ee32c" [metadata.files] +aiohttp = [ + {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8"}, + {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7dadf3c307b31e0e61689cbf9e06be7a867c563d5a63ce9dca578f956609abf8"}, + {file = "aiohttp-3.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a79004bb58748f31ae1cbe9fa891054baaa46fb106c2dc7af9f8e3304dc30316"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12de6add4038df8f72fac606dff775791a60f113a725c960f2bab01d8b8e6b15"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f0d5f33feb5f69ddd57a4a4bd3d56c719a141080b445cbf18f238973c5c9923"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eaba923151d9deea315be1f3e2b31cc39a6d1d2f682f942905951f4e40200922"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:099ebd2c37ac74cce10a3527d2b49af80243e2a4fa39e7bce41617fbc35fa3c1"}, + {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e5d962cf7e1d426aa0e528a7e198658cdc8aa4fe87f781d039ad75dcd52c516"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fa0ffcace9b3aa34d205d8130f7873fcfefcb6a4dd3dd705b0dab69af6712642"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61bfc23df345d8c9716d03717c2ed5e27374e0fe6f659ea64edcd27b4b044cf7"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:31560d268ff62143e92423ef183680b9829b1b482c011713ae941997921eebc8"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:01d7bdb774a9acc838e6b8f1d114f45303841b89b95984cbb7d80ea41172a9e3"}, + {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:97ef77eb6b044134c0b3a96e16abcb05ecce892965a2124c566af0fd60f717e2"}, + {file = "aiohttp-3.8.1-cp310-cp310-win32.whl", hash = "sha256:c2aef4703f1f2ddc6df17519885dbfa3514929149d3ff900b73f45998f2532fa"}, + {file = "aiohttp-3.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:713ac174a629d39b7c6a3aa757b337599798da4c1157114a314e4e391cd28e32"}, + {file = "aiohttp-3.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:473d93d4450880fe278696549f2e7aed8cd23708c3c1997981464475f32137db"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b5eeae8e019e7aad8af8bb314fb908dd2e028b3cdaad87ec05095394cce632"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af642b43ce56c24d063325dd2cf20ee012d2b9ba4c3c008755a301aaea720ad"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3630c3ef435c0a7c549ba170a0633a56e92629aeed0e707fec832dee313fb7a"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4a4a4e30bf1edcad13fb0804300557aedd07a92cabc74382fdd0ba6ca2661091"}, + {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f8b01295e26c68b3a1b90efb7a89029110d3a4139270b24fda961893216c440"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a25fa703a527158aaf10dafd956f7d42ac6d30ec80e9a70846253dd13e2f067b"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5bfde62d1d2641a1f5173b8c8c2d96ceb4854f54a44c23102e2ccc7e02f003ec"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:51467000f3647d519272392f484126aa716f747859794ac9924a7aafa86cd411"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:03a6d5349c9ee8f79ab3ff3694d6ce1cfc3ced1c9d36200cb8f08ba06bd3b782"}, + {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:102e487eeb82afac440581e5d7f8f44560b36cf0bdd11abc51a46c1cd88914d4"}, + {file = "aiohttp-3.8.1-cp36-cp36m-win32.whl", hash = "sha256:4aed991a28ea3ce320dc8ce655875e1e00a11bdd29fe9444dd4f88c30d558602"}, + {file = "aiohttp-3.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b0e20cddbd676ab8a64c774fefa0ad787cc506afd844de95da56060348021e96"}, + {file = "aiohttp-3.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:37951ad2f4a6df6506750a23f7cbabad24c73c65f23f72e95897bb2cecbae676"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c23b1ad869653bc818e972b7a3a79852d0e494e9ab7e1a701a3decc49c20d51"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15b09b06dae900777833fe7fc4b4aa426556ce95847a3e8d7548e2d19e34edb8"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:477c3ea0ba410b2b56b7efb072c36fa91b1e6fc331761798fa3f28bb224830dd"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2f2f69dca064926e79997f45b2f34e202b320fd3782f17a91941f7eb85502ee2"}, + {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ef9612483cb35171d51d9173647eed5d0069eaa2ee812793a75373447d487aa4"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6d69f36d445c45cda7b3b26afef2fc34ef5ac0cdc75584a87ef307ee3c8c6d00"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:55c3d1072704d27401c92339144d199d9de7b52627f724a949fc7d5fc56d8b93"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d00268fcb9f66fbcc7cd9fe423741d90c75ee029a1d15c09b22d23253c0a44"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:07b05cd3305e8a73112103c834e91cd27ce5b4bd07850c4b4dbd1877d3f45be7"}, + {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c34dc4958b232ef6188c4318cb7b2c2d80521c9a56c52449f8f93ab7bc2a8a1c"}, + {file = "aiohttp-3.8.1-cp37-cp37m-win32.whl", hash = "sha256:d2f9b69293c33aaa53d923032fe227feac867f81682f002ce33ffae978f0a9a9"}, + {file = "aiohttp-3.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6ae828d3a003f03ae31915c31fa684b9890ea44c9c989056fea96e3d12a9fa17"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0c7ebbbde809ff4e970824b2b6cb7e4222be6b95a296e46c03cf050878fc1785"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b7ef7cbd4fec9a1e811a5de813311ed4f7ac7d93e0fda233c9b3e1428f7dd7b"}, + {file = "aiohttp-3.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c3d6a4d0619e09dcd61021debf7059955c2004fa29f48788a3dfaf9c9901a7cd"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:718626a174e7e467f0558954f94af117b7d4695d48eb980146016afa4b580b2e"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:589c72667a5febd36f1315aa6e5f56dd4aa4862df295cb51c769d16142ddd7cd"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ed076098b171573161eb146afcb9129b5ff63308960aeca4b676d9d3c35e700"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:086f92daf51a032d062ec5f58af5ca6a44d082c35299c96376a41cbb33034675"}, + {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:11691cf4dc5b94236ccc609b70fec991234e7ef8d4c02dd0c9668d1e486f5abf"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:31d1e1c0dbf19ebccbfd62eff461518dcb1e307b195e93bba60c965a4dcf1ba0"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11a67c0d562e07067c4e86bffc1553f2cf5b664d6111c894671b2b8712f3aba5"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:bb01ba6b0d3f6c68b89fce7305080145d4877ad3acaed424bae4d4ee75faa950"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:44db35a9e15d6fe5c40d74952e803b1d96e964f683b5a78c3cc64eb177878155"}, + {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:844a9b460871ee0a0b0b68a64890dae9c415e513db0f4a7e3cab41a0f2fedf33"}, + {file = "aiohttp-3.8.1-cp38-cp38-win32.whl", hash = "sha256:7d08744e9bae2ca9c382581f7dce1273fe3c9bae94ff572c3626e8da5b193c6a"}, + {file = "aiohttp-3.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:04d48b8ce6ab3cf2097b1855e1505181bdd05586ca275f2505514a6e274e8e75"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5315a2eb0239185af1bddb1abf472d877fede3cc8d143c6cddad37678293237"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a996d01ca39b8dfe77440f3cd600825d05841088fd6bc0144cc6c2ec14cc5f74"}, + {file = "aiohttp-3.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:13487abd2f761d4be7c8ff9080de2671e53fff69711d46de703c310c4c9317ca"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea302f34477fda3f85560a06d9ebdc7fa41e82420e892fc50b577e35fc6a50b2"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2f635ce61a89c5732537a7896b6319a8fcfa23ba09bec36e1b1ac0ab31270d2"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e999f2d0e12eea01caeecb17b653f3713d758f6dcc770417cf29ef08d3931421"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0770e2806a30e744b4e21c9d73b7bee18a1cfa3c47991ee2e5a65b887c49d5cf"}, + {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d15367ce87c8e9e09b0f989bfd72dc641bcd04ba091c68cd305312d00962addd"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c7cefb4b0640703eb1069835c02486669312bf2f12b48a748e0a7756d0de33d"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:71927042ed6365a09a98a6377501af5c9f0a4d38083652bcd2281a06a5976724"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:28d490af82bc6b7ce53ff31337a18a10498303fe66f701ab65ef27e143c3b0ef"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b6613280ccedf24354406caf785db748bebbddcf31408b20c0b48cb86af76866"}, + {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81e3d8c34c623ca4e36c46524a3530e99c0bc95ed068fd6e9b55cb721d408fb2"}, + {file = "aiohttp-3.8.1-cp39-cp39-win32.whl", hash = "sha256:7187a76598bdb895af0adbd2fb7474d7f6025d170bc0a1130242da817ce9e7d1"}, + {file = "aiohttp-3.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac"}, + {file = "aiohttp-3.8.1.tar.gz", hash = "sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578"}, +] +aiosignal = [ + {file = "aiosignal-1.2.0-py3-none-any.whl", hash = "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a"}, + {file = "aiosignal-1.2.0.tar.gz", hash = "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"}, +] alabaster = [ {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, @@ -1568,10 +2019,18 @@ alabaster = [ antlr4-python3-runtime = [ {file = "antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b"}, ] +appdirs = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] argparse = [ {file = "argparse-1.4.0-py2.py3-none-any.whl", hash = "sha256:c31647edb69fd3d465a847ea3157d37bed1f95f19760b11a47aa91c04b666314"}, {file = "argparse-1.4.0.tar.gz", hash = "sha256:62b089a55be1d8949cd2bc7e0df0bddb9e028faefc8c32038cc84862aefdd6e4"}, ] +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"}, +] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -1589,16 +2048,16 @@ bcp47 = [ {file = "bcp47-0.0.4.tar.gz", hash = "sha256:4878d2f3e697ef39ef3891a147280705e4377d5a8d7eb0702129b8d4a3718702"}, ] bioregistry = [ - {file = "bioregistry-0.4.96-py3-none-any.whl", hash = "sha256:57cfe2ef4dc3130c1d97105bda88aa48cbe405a06bc010eb6dc0f48fc07cfee3"}, - {file = "bioregistry-0.4.96.tar.gz", hash = "sha256:820583f75744aac4a30a190cc5c33f4ba3a2f5dd235413d1ff4ab10588d1d98d"}, + {file = "bioregistry-0.4.120-py3-none-any.whl", hash = "sha256:7dcd6bc206eee972e6f229f2b45638a66b559d1487a9c691568a0d80d030385d"}, + {file = "bioregistry-0.4.120.tar.gz", hash = "sha256:f32d9266f0961c61eaa541d1dd221b35946ae415a92c886b6823ef523218e7f7"}, ] bleach = [ {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, {file = "bleach-5.0.0.tar.gz", hash = "sha256:c6d6cc054bdc9c83b48b8083e236e5f00f238428666d2ce2e083eaa5fd568565"}, ] certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, + {file = "certifi-2022.5.18.1-py3-none-any.whl", hash = "sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a"}, + {file = "certifi-2022.5.18.1.tar.gz", hash = "sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7"}, ] cffi = [ {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, @@ -1664,8 +2123,8 @@ charset-normalizer = [ {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, ] click = [ - {file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"}, - {file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] click-log = [ {file = "click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975"}, @@ -1680,26 +2139,28 @@ commonmark = [ {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, ] cryptography = [ - {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6"}, - {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf"}, - {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86"}, - {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2"}, - {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb"}, - {file = "cryptography-36.0.2-cp36-abi3-win32.whl", hash = "sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6"}, - {file = "cryptography-36.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e"}, - {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51"}, - {file = "cryptography-36.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3"}, - {file = "cryptography-36.0.2.tar.gz", hash = "sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9"}, + {file = "cryptography-37.0.2-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:ef15c2df7656763b4ff20a9bc4381d8352e6640cfeb95c2972c38ef508e75181"}, + {file = "cryptography-37.0.2-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3c81599befb4d4f3d7648ed3217e00d21a9341a9a688ecdd615ff72ffbed7336"}, + {file = "cryptography-37.0.2-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2bd1096476aaac820426239ab534b636c77d71af66c547b9ddcd76eb9c79e004"}, + {file = "cryptography-37.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:31fe38d14d2e5f787e0aecef831457da6cec68e0bb09a35835b0b44ae8b988fe"}, + {file = "cryptography-37.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:093cb351031656d3ee2f4fa1be579a8c69c754cf874206be1d4cf3b542042804"}, + {file = "cryptography-37.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59b281eab51e1b6b6afa525af2bd93c16d49358404f814fe2c2410058623928c"}, + {file = "cryptography-37.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:0cc20f655157d4cfc7bada909dc5cc228211b075ba8407c46467f63597c78178"}, + {file = "cryptography-37.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:f8ec91983e638a9bcd75b39f1396e5c0dc2330cbd9ce4accefe68717e6779e0a"}, + {file = "cryptography-37.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:46f4c544f6557a2fefa7ac8ac7d1b17bf9b647bd20b16decc8fbcab7117fbc15"}, + {file = "cryptography-37.0.2-cp36-abi3-win32.whl", hash = "sha256:731c8abd27693323b348518ed0e0705713a36d79fdbd969ad968fbef0979a7e0"}, + {file = "cryptography-37.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:471e0d70201c069f74c837983189949aa0d24bb2d751b57e26e3761f2f782b8d"}, + {file = "cryptography-37.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a68254dd88021f24a68b613d8c51d5c5e74d735878b9e32cc0adf19d1f10aaf9"}, + {file = "cryptography-37.0.2-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:a7d5137e556cc0ea418dca6186deabe9129cee318618eb1ffecbd35bee55ddc1"}, + {file = "cryptography-37.0.2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aeaba7b5e756ea52c8861c133c596afe93dd716cbcacae23b80bc238202dc023"}, + {file = "cryptography-37.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95e590dd70642eb2079d280420a888190aa040ad20f19ec8c6e097e38aa29e06"}, + {file = "cryptography-37.0.2-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1b9362d34363f2c71b7853f6251219298124aa4cc2075ae2932e64c91a3e2717"}, + {file = "cryptography-37.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e53258e69874a306fcecb88b7534d61820db8a98655662a3dd2ec7f1afd9132f"}, + {file = "cryptography-37.0.2-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:1f3bfbd611db5cb58ca82f3deb35e83af34bb8cf06043fa61500157d50a70982"}, + {file = "cryptography-37.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:419c57d7b63f5ec38b1199a9521d77d7d1754eb97827bbb773162073ccd8c8d4"}, + {file = "cryptography-37.0.2-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:dc26bb134452081859aa21d4990474ddb7e863aa39e60d1592800a8865a702de"}, + {file = "cryptography-37.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b8398b3d0efc420e777c40c16764d6870bcef2eb383df9c6dbb9ffe12c64452"}, + {file = "cryptography-37.0.2.tar.gz", hash = "sha256:f224ad253cc9cea7568f49077007d2263efa57396a2f2f78114066fd54b5c68e"}, ] decorator = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, @@ -1709,6 +2170,10 @@ deprecated = [ {file = "Deprecated-1.2.13-py2.py3-none-any.whl", hash = "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d"}, {file = "Deprecated-1.2.13.tar.gz", hash = "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d"}, ] +deprecation = [ + {file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"}, + {file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"}, +] docopt = [ {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, ] @@ -1720,13 +2185,101 @@ 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"}, ] +fastobo = [ + {file = "fastobo-0.11.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:80879ce45dfe4457959301b37563b2073bd19f265c9395f5ae99f2eac16f7739"}, + {file = "fastobo-0.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1aaf6aee2d2e2660d6c3eb88ef0d03353e51d7342323e5dae62814cb5e0ca712"}, + {file = "fastobo-0.11.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:93aa0a3760315de43d6f770d990be2933aa63cb6d425adb25f20413223937c2a"}, + {file = "fastobo-0.11.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:d647a215e9add293636c37a4df3f708d4e85cf87bbaf8f19cd0c5e1c79f51060"}, + {file = "fastobo-0.11.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60fb668178eb07b3952c8a9dea34597c1a019c33d93674dfcbc732d8dcbe7e3"}, + {file = "fastobo-0.11.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:130e30d2f20833fd181fb9439404f6f90e7d0ace582a0af11a2d93f5a91c72d4"}, + {file = "fastobo-0.11.1-cp36-cp36m-win_amd64.whl", hash = "sha256:7aa23b8bec6cc89ba383a9535637076d2cfc8e420d3ea41d6ce4be412250a766"}, + {file = "fastobo-0.11.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:cf8f3594e11c3a8e84c4cbf064a2cb02a8601f6a22406ae5607181552cd30fa2"}, + {file = "fastobo-0.11.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e2d6de2a8a2d1416e81a48a966433947145f1186c201eeb5362e80b005afb14"}, + {file = "fastobo-0.11.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a368470a46f8cacf1e75e65aa26c566ba2f60040973357cdb6552c4c077e7e4c"}, + {file = "fastobo-0.11.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2c45bb2cf3eae700d2e92a6280b06ac580b116e6cc3e295074844a24a87b5257"}, + {file = "fastobo-0.11.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:159850e7cee0f63b6223ec111c3077c5d73e98ba741d50240bf548630e4e4eae"}, + {file = "fastobo-0.11.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e71ed4af0acb217c7bb39c322f69cfe0b05cbc603bf1c55ffbb9e1a434dd2f00"}, + {file = "fastobo-0.11.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6bd12171b5244a943c37d03d34161a2ced262be8f425e964108114f1c86a0ec0"}, + {file = "fastobo-0.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:466318add3732d95b8c94433f67364d69a102e6e0c03fea92e675a12666802b8"}, + {file = "fastobo-0.11.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:be54672b8b022705a5d9038fb0a4af61dd213061dbec15ad979a6ee4254118a9"}, + {file = "fastobo-0.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cd444acffff0d96754a7fb0d1b41b6c914ec2af297baaf7e833a7ed9423f6a8"}, + {file = "fastobo-0.11.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:01e5d950d7588f8ddf2d3d966f917e9a4b6639ed6c404a5946c07fcc56224dd3"}, + {file = "fastobo-0.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:a16e0ebc728f940423abac0648e49d0b3d79922822739b929a3ac47a60949798"}, + {file = "fastobo-0.11.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0d91e412186afb9e8090fc21ae664fb9165e6c06d5c223a5cb55c1103e5d9fe9"}, + {file = "fastobo-0.11.1.tar.gz", hash = "sha256:4f71dcca4d841496816bba873d6070b6a414cac385a561747e900c740b762ef3"}, +] +frozenlist = [ + {file = "frozenlist-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2257aaba9660f78c7b1d8fea963b68f3feffb1a9d5d05a18401ca9eb3e8d0a3"}, + {file = "frozenlist-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4a44ebbf601d7bac77976d429e9bdb5a4614f9f4027777f9e54fd765196e9d3b"}, + {file = "frozenlist-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:45334234ec30fc4ea677f43171b18a27505bfb2dba9aca4398a62692c0ea8868"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47be22dc27ed933d55ee55845d34a3e4e9f6fee93039e7f8ebadb0c2f60d403f"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03a7dd1bfce30216a3f51a84e6dd0e4a573d23ca50f0346634916ff105ba6e6b"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:691ddf6dc50480ce49f68441f1d16a4c3325887453837036e0fb94736eae1e58"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bde99812f237f79eaf3f04ebffd74f6718bbd216101b35ac7955c2d47c17da02"}, + {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a202458d1298ced3768f5a7d44301e7c86defac162ace0ab7434c2e961166e8"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b9e3e9e365991f8cc5f5edc1fd65b58b41d0514a6a7ad95ef5c7f34eb49b3d3e"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:04cb491c4b1c051734d41ea2552fde292f5f3a9c911363f74f39c23659c4af78"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:436496321dad302b8b27ca955364a439ed1f0999311c393dccb243e451ff66aa"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:754728d65f1acc61e0f4df784456106e35afb7bf39cfe37227ab00436fb38676"}, + {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6eb275c6385dd72594758cbe96c07cdb9bd6becf84235f4a594bdf21e3596c9d"}, + {file = "frozenlist-1.3.0-cp310-cp310-win32.whl", hash = "sha256:e30b2f9683812eb30cf3f0a8e9f79f8d590a7999f731cf39f9105a7c4a39489d"}, + {file = "frozenlist-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f7353ba3367473d1d616ee727945f439e027f0bb16ac1a750219a8344d1d5d3c"}, + {file = "frozenlist-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88aafd445a233dbbf8a65a62bc3249a0acd0d81ab18f6feb461cc5a938610d24"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4406cfabef8f07b3b3af0f50f70938ec06d9f0fc26cbdeaab431cbc3ca3caeaa"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cf829bd2e2956066dd4de43fd8ec881d87842a06708c035b37ef632930505a2"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:603b9091bd70fae7be28bdb8aa5c9990f4241aa33abb673390a7f7329296695f"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25af28b560e0c76fa41f550eacb389905633e7ac02d6eb3c09017fa1c8cdfde1"}, + {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c7a8a9fc9383b52c410a2ec952521906d355d18fccc927fca52ab575ee8b93"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:65bc6e2fece04e2145ab6e3c47428d1bbc05aede61ae365b2c1bddd94906e478"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3f7c935c7b58b0d78c0beea0c7358e165f95f1fd8a7e98baa40d22a05b4a8141"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd89acd1b8bb4f31b47072615d72e7f53a948d302b7c1d1455e42622de180eae"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:6983a31698490825171be44ffbafeaa930ddf590d3f051e397143a5045513b01"}, + {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:adac9700675cf99e3615eb6a0eb5e9f5a4143c7d42c05cea2e7f71c27a3d0846"}, + {file = "frozenlist-1.3.0-cp37-cp37m-win32.whl", hash = "sha256:0c36e78b9509e97042ef869c0e1e6ef6429e55817c12d78245eb915e1cca7468"}, + {file = "frozenlist-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:57f4d3f03a18facacb2a6bcd21bccd011e3b75d463dc49f838fd699d074fabd1"}, + {file = "frozenlist-1.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8c905a5186d77111f02144fab5b849ab524f1e876a1e75205cd1386a9be4b00a"}, + {file = "frozenlist-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b5009062d78a8c6890d50b4e53b0ddda31841b3935c1937e2ed8c1bda1c7fb9d"}, + {file = "frozenlist-1.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2fdc3cd845e5a1f71a0c3518528bfdbfe2efaf9886d6f49eacc5ee4fd9a10953"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92e650bd09b5dda929523b9f8e7f99b24deac61240ecc1a32aeba487afcd970f"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40dff8962b8eba91fd3848d857203f0bd704b5f1fa2b3fc9af64901a190bba08"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:768efd082074bb203c934e83a61654ed4931ef02412c2fbdecea0cff7ecd0274"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:006d3595e7d4108a12025ddf415ae0f6c9e736e726a5db0183326fd191b14c5e"}, + {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:871d42623ae15eb0b0e9df65baeee6976b2e161d0ba93155411d58ff27483ad8"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aff388be97ef2677ae185e72dc500d19ecaf31b698986800d3fc4f399a5e30a5"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9f892d6a94ec5c7b785e548e42722e6f3a52f5f32a8461e82ac3e67a3bd073f1"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:e982878792c971cbd60ee510c4ee5bf089a8246226dea1f2138aa0bb67aff148"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c6c321dd013e8fc20735b92cb4892c115f5cdb82c817b1e5b07f6b95d952b2f0"}, + {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:30530930410855c451bea83f7b272fb1c495ed9d5cc72895ac29e91279401db3"}, + {file = "frozenlist-1.3.0-cp38-cp38-win32.whl", hash = "sha256:40ec383bc194accba825fbb7d0ef3dda5736ceab2375462f1d8672d9f6b68d07"}, + {file = "frozenlist-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:f20baa05eaa2bcd5404c445ec51aed1c268d62600362dc6cfe04fae34a424bd9"}, + {file = "frozenlist-1.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0437fe763fb5d4adad1756050cbf855bbb2bf0d9385c7bb13d7a10b0dd550486"}, + {file = "frozenlist-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b684c68077b84522b5c7eafc1dc735bfa5b341fb011d5552ebe0968e22ed641c"}, + {file = "frozenlist-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93641a51f89473837333b2f8100f3f89795295b858cd4c7d4a1f18e299dc0a4f"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6d32ff213aef0fd0bcf803bffe15cfa2d4fde237d1d4838e62aec242a8362fa"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31977f84828b5bb856ca1eb07bf7e3a34f33a5cddce981d880240ba06639b94d"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c62964192a1c0c30b49f403495911298810bada64e4f03249ca35a33ca0417a"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4eda49bea3602812518765810af732229b4291d2695ed24a0a20e098c45a707b"}, + {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acb267b09a509c1df5a4ca04140da96016f40d2ed183cdc356d237286c971b51"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e1e26ac0a253a2907d654a37e390904426d5ae5483150ce3adedb35c8c06614a"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f96293d6f982c58ebebb428c50163d010c2f05de0cde99fd681bfdc18d4b2dc2"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e84cb61b0ac40a0c3e0e8b79c575161c5300d1d89e13c0e02f76193982f066ed"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:ff9310f05b9d9c5c4dd472983dc956901ee6cb2c3ec1ab116ecdde25f3ce4951"}, + {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d26b650b71fdc88065b7a21f8ace70175bcf3b5bdba5ea22df4bfd893e795a3b"}, + {file = "frozenlist-1.3.0-cp39-cp39-win32.whl", hash = "sha256:01a73627448b1f2145bddb6e6c2259988bb8aee0fb361776ff8604b99616cd08"}, + {file = "frozenlist-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:772965f773757a6026dea111a15e6e2678fbd6216180f82a48a40b27de1ee2ab"}, + {file = "frozenlist-1.3.0.tar.gz", hash = "sha256:ce6f2ba0edb7b0c1d8976565298ad2deba6f8064d2bebb6ffce2ca896eb35b0b"}, +] +fsspec = [ + {file = "fsspec-2022.5.0-py3-none-any.whl", hash = "sha256:2c198c50eb541a80bbd03540b07602c4a957366f3fb416a1f270d34bd4ff0926"}, + {file = "fsspec-2022.5.0.tar.gz", hash = "sha256:7a5459c75c44e760fbe6a3ccb1f37e81e023cde7da8ba20401258d877ec483b4"}, +] funowl = [ {file = "funowl-0.1.11-py3-none-any.whl", hash = "sha256:a15cf0a14976667bd037fea4c8b8dc169063bba1b7e0ce4799bd4334091e2fde"}, {file = "funowl-0.1.11.tar.gz", hash = "sha256:d857d1d7781a8cd2c84533d437d3580ff2f39c26c548dfaca5d5d6d85ac8a3fb"}, ] ghp-import = [ - {file = "ghp-import-2.0.2.tar.gz", hash = "sha256:947b3771f11be850c852c64b561c600fdddf794bab363060854c1ee7ad05e071"}, - {file = "ghp_import-2.0.2-py3-none-any.whl", hash = "sha256:5f8962b30b20652cdffa9c5a9812f7de6bcb56ec475acac579807719bf242c46"}, + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, ] graphviz = [ {file = "graphviz-0.20-py3-none-any.whl", hash = "sha256:62c5f48bcc534a45b4588c548ff75e419c1f1f3a33d31a91796ae80a7f581e4a"}, @@ -1802,12 +2355,12 @@ imagesize = [ {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, - {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, + {file = "importlib_metadata-4.11.4-py3-none-any.whl", hash = "sha256:c58c8eb8a762858f49e18436ff552e83914778e50e9d2f1660535ffb364552ec"}, + {file = "importlib_metadata-4.11.4.tar.gz", hash = "sha256:5d26852efe48c0a32b0509ffbc583fda1a2266545a78d104a6f4aff3db17d700"}, ] inflect = [ - {file = "inflect-5.5.2-py3-none-any.whl", hash = "sha256:82138a8cd11159eb20e8e8310e74050f7dd48b2168c5d33bc335cf6ec8198678"}, - {file = "inflect-5.5.2.tar.gz", hash = "sha256:0b7f13909a7769bc25d168965c1e665e70686de6b577121b96448bc28289971f"}, + {file = "inflect-5.6.0-py3-none-any.whl", hash = "sha256:967d6db69932bac9f1977b8f2dd131a59147f4b56134cfc74a3f44e5adb65223"}, + {file = "inflect-5.6.0.tar.gz", hash = "sha256:a0612e7bba1028bb7efa121bf8f012aeda9355252d01b257057fa2a8f5859cef"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1822,8 +2375,12 @@ jeepney = [ {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, ] jinja2 = [ - {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, - {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] +joblib = [ + {file = "joblib-1.1.0-py2.py3-none-any.whl", hash = "sha256:f21f109b3c7ff9d95f8387f752d0d9c34a02aa2f7060c2135f465da0e5160ff6"}, + {file = "joblib-1.1.0.tar.gz", hash = "sha256:4158fcecd13733f8be669be0683b96ebdbbd38d23559f54dca7205aea1bf1e35"}, ] json-flattener = [ {file = "json_flattener-0.1.9-py3-none-any.whl", hash = "sha256:6b027746f08bf37a75270f30c6690c7149d5f704d8af1740c346a3a1236bc941"}, @@ -1851,28 +2408,32 @@ jsonpointer = [ {file = "jsonpointer-2.3.tar.gz", hash = "sha256:97cba51526c829282218feb99dab1b1e6bdf8efd1c43dc9d57be093c0d69c99a"}, ] jsonschema = [ - {file = "jsonschema-4.4.0-py3-none-any.whl", hash = "sha256:77281a1f71684953ee8b3d488371b162419767973789272434bbc3f29d9c8823"}, - {file = "jsonschema-4.4.0.tar.gz", hash = "sha256:636694eb41b3535ed608fe04129f26542b59ed99808b4f688aa32dcf55317a83"}, + {file = "jsonschema-4.5.1-py3-none-any.whl", hash = "sha256:71b5e39324422543546572954ce71c67728922c104902cb7ce252e522235b33f"}, + {file = "jsonschema-4.5.1.tar.gz", hash = "sha256:7c6d882619340c3347a1bf7315e147e6d3dae439033ae6383d6acb908c101dfc"}, ] keyring = [ - {file = "keyring-23.5.0-py3-none-any.whl", hash = "sha256:b0d28928ac3ec8e42ef4cc227822647a19f1d544f21f96457965dc01cf555261"}, - {file = "keyring-23.5.0.tar.gz", hash = "sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9"}, + {file = "keyring-23.5.1-py3-none-any.whl", hash = "sha256:9ef58314bcc823f426b49ec787539a2d73571b37de4cd498f839803b01acff1e"}, + {file = "keyring-23.5.1.tar.gz", hash = "sha256:dee502cdf18a98211bef428eea11456a33c00718b2f08524fd5727c7f424bffd"}, +] +lark = [ + {file = "lark-1.1.2-py2.py3-none-any.whl", hash = "sha256:c1ab213fc5e2d273fe2d91da218ccc8b5b92d065b17faa5e743499cb16594b7d"}, + {file = "lark-1.1.2.tar.gz", hash = "sha256:7a8d0c07d663da9391d7faee1bf1d7df4998c47ca43a593cbef5c7566acd057a"}, ] linkml = [ - {file = "linkml-1.2.8-py3-none-any.whl", hash = "sha256:9de4ebf98708bff9bebd98713fab55c30beaf1c5d1311737f31c29573ac79953"}, - {file = "linkml-1.2.8.tar.gz", hash = "sha256:3da432b706108d5e3ebbce0df06b7e45bfea5b7c97559fefd6bcf754ed184250"}, + {file = "linkml-1.2.11-py3-none-any.whl", hash = "sha256:86ebe4cc818c55e8e5e2b7c3588dd42c2028e23bc55378faa98d42d411abc35d"}, + {file = "linkml-1.2.11.tar.gz", hash = "sha256:36e24cbba7ed360da3668e0625751b2a767a3f1d05eb1235f1902816e6aa57dd"}, ] linkml-dataops = [ {file = "linkml_dataops-0.1.0-py3-none-any.whl", hash = "sha256:193cf7f659e5f07946d2c2761896910d5f7151d91282543b1363801f68307f4c"}, {file = "linkml_dataops-0.1.0.tar.gz", hash = "sha256:4550eab65e78b70dc3b9c651724a94ac2b1d1edb2fbe576465f1d6951a54ed04"}, ] linkml-runtime = [ - {file = "linkml_runtime-1.2.7-py3-none-any.whl", hash = "sha256:ba02d958af88ebc3eff8b521adb61b89049ced91523d637543dffe1493ae9900"}, - {file = "linkml_runtime-1.2.7.tar.gz", hash = "sha256:8fa7d89a370217759a4e1c883c9da17e3dbb4144e55cfc5a4bd3d69b66b66d3e"}, + {file = "linkml-runtime-1.2.17.tar.gz", hash = "sha256:c3620a7260cee6ed31db3b51de73d818a33d030f64ddcabc143c8f5590c35149"}, + {file = "linkml_runtime-1.2.17-py3-none-any.whl", hash = "sha256:b9974a34c8ab58ea036e9a757c8117e745a991d732d7b846df89968dad4ecaff"}, ] markdown = [ - {file = "Markdown-3.3.6-py3-none-any.whl", hash = "sha256:9923332318f843411e9932237530df53162e29dc7a4e2b91e35764583c46c9a3"}, - {file = "Markdown-3.3.6.tar.gz", hash = "sha256:76df8ae32294ec39dcf89340382882dfa12975f87f45c3ed1ecdb1e8cefc7006"}, + {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"}, + {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, ] markdown-it-py = [ {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, @@ -1940,39 +2501,114 @@ more-click = [ {file = "more_click-0.1.1-py3-none-any.whl", hash = "sha256:ff68c7e874fd409ce501903be3177363499aa9c2662607a3b66568f766dea527"}, {file = "more_click-0.1.1.tar.gz", hash = "sha256:277c64767a6a9c6625ec6bc3e1241012867f6953b2295b2a1e8eeddec586eb53"}, ] +multidict = [ + {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389"}, + {file = "multidict-6.0.2-cp310-cp310-win32.whl", hash = "sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293"}, + {file = "multidict-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658"}, + {file = "multidict-6.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15"}, + {file = "multidict-6.0.2-cp37-cp37m-win32.whl", hash = "sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc"}, + {file = "multidict-6.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d"}, + {file = "multidict-6.0.2-cp38-cp38-win32.whl", hash = "sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57"}, + {file = "multidict-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937"}, + {file = "multidict-6.0.2-cp39-cp39-win32.whl", hash = "sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a"}, + {file = "multidict-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae"}, + {file = "multidict-6.0.2.tar.gz", hash = "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013"}, +] myst-parser = [ {file = "myst-parser-0.17.2.tar.gz", hash = "sha256:4c076d649e066f9f5c7c661bae2658be1ca06e76b002bb97f02a09398707686c"}, {file = "myst_parser-0.17.2-py3-none-any.whl", hash = "sha256:1635ce3c18965a528d6de980f989ff64d6a1effb482e1f611b1bfb79e38f3d98"}, ] +networkx = [ + {file = "networkx-2.8.2-py3-none-any.whl", hash = "sha256:51d6ae63c24dcd33901357688a2ad20d6bcd38f9a4c5307720048d3a8081059c"}, + {file = "networkx-2.8.2.tar.gz", hash = "sha256:ae99c9b0d35e5b4a62cf1cfea01e5b3633d8d02f4a0ead69685b6e7de5b85eab"}, +] num2words = [ {file = "num2words-0.5.10-py3-none-any.whl", hash = "sha256:0b6e5f53f11d3005787e206d9c03382f459ef048a43c544e3db3b1e05a961548"}, {file = "num2words-0.5.10.tar.gz", hash = "sha256:37cd4f60678f7e1045cdc3adf6acf93c8b41bf732da860f97d301f04e611cc57"}, ] numpy = [ - {file = "numpy-1.22.3-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:92bfa69cfbdf7dfc3040978ad09a48091143cffb778ec3b03fa170c494118d75"}, - {file = "numpy-1.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8251ed96f38b47b4295b1ae51631de7ffa8260b5b087808ef09a39a9d66c97ab"}, - {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48a3aecd3b997bf452a2dedb11f4e79bc5bfd21a1d4cc760e703c31d57c84b3e"}, - {file = "numpy-1.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3bae1a2ed00e90b3ba5f7bd0a7c7999b55d609e0c54ceb2b076a25e345fa9f4"}, - {file = "numpy-1.22.3-cp310-cp310-win32.whl", hash = "sha256:f950f8845b480cffe522913d35567e29dd381b0dc7e4ce6a4a9f9156417d2430"}, - {file = "numpy-1.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4"}, - {file = "numpy-1.22.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:201b4d0552831f7250a08d3b38de0d989d6f6e4658b709a02a73c524ccc6ffce"}, - {file = "numpy-1.22.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8c1f39caad2c896bc0018f699882b345b2a63708008be29b1f355ebf6f933fe"}, - {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:568dfd16224abddafb1cbcce2ff14f522abe037268514dd7e42c6776a1c3f8e5"}, - {file = "numpy-1.22.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca688e1b9b95d80250bca34b11a05e389b1420d00e87a0d12dc45f131f704a1"}, - {file = "numpy-1.22.3-cp38-cp38-win32.whl", hash = "sha256:e7927a589df200c5e23c57970bafbd0cd322459aa7b1ff73b7c2e84d6e3eae62"}, - {file = "numpy-1.22.3-cp38-cp38-win_amd64.whl", hash = "sha256:07a8c89a04997625236c5ecb7afe35a02af3896c8aa01890a849913a2309c676"}, - {file = "numpy-1.22.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2c10a93606e0b4b95c9b04b77dc349b398fdfbda382d2a39ba5a822f669a0123"}, - {file = "numpy-1.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fade0d4f4d292b6f39951b6836d7a3c7ef5b2347f3c420cd9820a1d90d794802"}, - {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bfb1bb598e8229c2d5d48db1860bcf4311337864ea3efdbe1171fb0c5da515d"}, - {file = "numpy-1.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97098b95aa4e418529099c26558eeb8486e66bd1e53a6b606d684d0c3616b168"}, - {file = "numpy-1.22.3-cp39-cp39-win32.whl", hash = "sha256:fdf3c08bce27132395d3c3ba1503cac12e17282358cb4bddc25cc46b0aca07aa"}, - {file = "numpy-1.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:639b54cdf6aa4f82fe37ebf70401bbb74b8508fddcf4797f9fe59615b8c5813a"}, - {file = "numpy-1.22.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f"}, - {file = "numpy-1.22.3.zip", hash = "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18"}, + {file = "numpy-1.22.4-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:ba9ead61dfb5d971d77b6c131a9dbee62294a932bf6a356e48c75ae684e635b3"}, + {file = "numpy-1.22.4-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:1ce7ab2053e36c0a71e7a13a7475bd3b1f54750b4b433adc96313e127b870887"}, + {file = "numpy-1.22.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7228ad13744f63575b3a972d7ee4fd61815b2879998e70930d4ccf9ec721dce0"}, + {file = "numpy-1.22.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43a8ca7391b626b4c4fe20aefe79fec683279e31e7c79716863b4b25021e0e74"}, + {file = "numpy-1.22.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a911e317e8c826ea632205e63ed8507e0dc877dcdc49744584dfc363df9ca08c"}, + {file = "numpy-1.22.4-cp310-cp310-win32.whl", hash = "sha256:9ce7df0abeabe7fbd8ccbf343dc0db72f68549856b863ae3dd580255d009648e"}, + {file = "numpy-1.22.4-cp310-cp310-win_amd64.whl", hash = "sha256:3e1ffa4748168e1cc8d3cde93f006fe92b5421396221a02f2274aab6ac83b077"}, + {file = "numpy-1.22.4-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:59d55e634968b8f77d3fd674a3cf0b96e85147cd6556ec64ade018f27e9479e1"}, + {file = "numpy-1.22.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c1d937820db6e43bec43e8d016b9b3165dcb42892ea9f106c70fb13d430ffe72"}, + {file = "numpy-1.22.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4c5d5eb2ec8da0b4f50c9a843393971f31f1d60be87e0fb0917a49133d257d6"}, + {file = "numpy-1.22.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64f56fc53a2d18b1924abd15745e30d82a5782b2cab3429aceecc6875bd5add0"}, + {file = "numpy-1.22.4-cp38-cp38-win32.whl", hash = "sha256:fb7a980c81dd932381f8228a426df8aeb70d59bbcda2af075b627bbc50207cba"}, + {file = "numpy-1.22.4-cp38-cp38-win_amd64.whl", hash = "sha256:e96d7f3096a36c8754207ab89d4b3282ba7b49ea140e4973591852c77d09eb76"}, + {file = "numpy-1.22.4-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:4c6036521f11a731ce0648f10c18ae66d7143865f19f7299943c985cdc95afb5"}, + {file = "numpy-1.22.4-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:b89bf9b94b3d624e7bb480344e91f68c1c6c75f026ed6755955117de00917a7c"}, + {file = "numpy-1.22.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2d487e06ecbf1dc2f18e7efce82ded4f705f4bd0cd02677ffccfb39e5c284c7e"}, + {file = "numpy-1.22.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3eb268dbd5cfaffd9448113539e44e2dd1c5ca9ce25576f7c04a5453edc26fa"}, + {file = "numpy-1.22.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37431a77ceb9307c28382c9773da9f306435135fae6b80b62a11c53cfedd8802"}, + {file = "numpy-1.22.4-cp39-cp39-win32.whl", hash = "sha256:cc7f00008eb7d3f2489fca6f334ec19ca63e31371be28fd5dad955b16ec285bd"}, + {file = "numpy-1.22.4-cp39-cp39-win_amd64.whl", hash = "sha256:f0725df166cf4785c0bc4cbfb320203182b1ecd30fee6e541c8752a92df6aa32"}, + {file = "numpy-1.22.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0791fbd1e43bf74b3502133207e378901272f3c156c4df4954cad833b1380207"}, + {file = "numpy-1.22.4.zip", hash = "sha256:425b390e4619f58d8526b3dcf656dde069133ae5c240229821f01b5f44ea07af"}, +] +nxontology = [ + {file = "nxontology-0.4.1-py3-none-any.whl", hash = "sha256:74cc228adcbbde49c4b35eb40c8b69db40e0a07757533573a775e88b7b2d29f9"}, + {file = "nxontology-0.4.1.tar.gz", hash = "sha256:8f1e5d6d7787542e9414be4ae34bb09e369dbaf2d6c646bba2d18b122c083d44"}, +] +oaklib = [ + {file = "oaklib-0.1.17-py3-none-any.whl", hash = "sha256:137cca9a01b3c475396a9432928fbd8bfaa1acfa7fe55ee65b80e8fe0b552640"}, + {file = "oaklib-0.1.17.tar.gz", hash = "sha256:8eb46b106d1b5ecf7cf4e6a36078902040884fc759f196d51f0122601b979eb9"}, ] openpyxl = [ - {file = "openpyxl-3.0.9-py2.py3-none-any.whl", hash = "sha256:8f3b11bd896a95468a4ab162fc4fcd260d46157155d1f8bfaabb99d88cfcf79f"}, - {file = "openpyxl-3.0.9.tar.gz", hash = "sha256:40f568b9829bf9e446acfffce30250ac1fa39035124d55fc024025c41481c90f"}, + {file = "openpyxl-3.0.10-py2.py3-none-any.whl", hash = "sha256:0ab6d25d01799f97a9464630abacbb34aafecdcaa0ef3cba6d6b3499867d0355"}, + {file = "openpyxl-3.0.10.tar.gz", hash = "sha256:e47805627aebcf860edb4edf7987b1309c1b3632f3750538ed962bbcc3bd7449"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -2001,6 +2637,10 @@ pandas = [ {file = "pandas-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:09d8be7dd9e1c4c98224c4dfe8abd60d145d934e9fc1f5f411266308ae683e6a"}, {file = "pandas-1.4.2.tar.gz", hash = "sha256:92bc1fc585f1463ca827b45535957815b7deb218c549b7c18402c322c7549a12"}, ] +pandasql = [ + {file = "pandasql-0.7.3-py2.7.egg", hash = "sha256:75f08c5cdfd19f61ceed8c38a6ac138c353776ad3be8e015edcee977c2299aad"}, + {file = "pandasql-0.7.3.tar.gz", hash = "sha256:1eb248869086435a7d85281ebd9fe525d69d9d954a0dceb854f71a8d0fd8de69"}, +] parse = [ {file = "parse-1.19.0.tar.gz", hash = "sha256:9ff82852bcb65d139813e2a5197627a94966245c897796760a3a2a8eb66f020b"}, ] @@ -2021,6 +2661,10 @@ prefixcommons = [ {file = "prefixcommons-0.1.9-py3.8.egg", hash = "sha256:f820dc69f0eba1f6fd80bdb2e78420e4970f20dfb4c307fed77c607198ca69f2"}, {file = "prefixcommons-0.1.9.tar.gz", hash = "sha256:a4a6decd6c1a2497b2b10193fa4ed69ed91cea20deb3a9781815b6bf3f3e1003"}, ] +pronto = [ + {file = "pronto-2.4.5-py2.py3-none-any.whl", hash = "sha256:b87e6be7d6bb55a89e3d9c857ba987335f91db10e62b351d49c6265f0fdc212d"}, + {file = "pronto-2.4.5.tar.gz", hash = "sha256:2bed414a0721c7155a258e802122cafb2ec08f827098c1b59aa0323af242bcaf"}, +] psycopg2-binary = [ {file = "psycopg2-binary-2.9.3.tar.gz", hash = "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e"}, {file = "psycopg2_binary-2.9.3-cp310-cp310-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:539b28661b71da7c0e428692438efbcd048ca21ea81af618d845e06ebfd29478"}, @@ -2088,56 +2732,57 @@ pycparser = [ {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] pydantic = [ - {file = "pydantic-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb23bcc093697cdea2708baae4f9ba0e972960a835af22560f6ae4e7e47d33f5"}, - {file = "pydantic-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1d5278bd9f0eee04a44c712982343103bba63507480bfd2fc2790fa70cd64cf4"}, - {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab624700dc145aa809e6f3ec93fb8e7d0f99d9023b713f6a953637429b437d37"}, - {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8d7da6f1c1049eefb718d43d99ad73100c958a5367d30b9321b092771e96c25"}, - {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3c3b035103bd4e2e4a28da9da7ef2fa47b00ee4a9cf4f1a735214c1bcd05e0f6"}, - {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3011b975c973819883842c5ab925a4e4298dffccf7782c55ec3580ed17dc464c"}, - {file = "pydantic-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:086254884d10d3ba16da0588604ffdc5aab3f7f09557b998373e885c690dd398"}, - {file = "pydantic-1.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0fe476769acaa7fcddd17cadd172b156b53546ec3614a4d880e5d29ea5fbce65"}, - {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8e9dcf1ac499679aceedac7e7ca6d8641f0193c591a2d090282aaf8e9445a46"}, - {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e4c28f30e767fd07f2ddc6f74f41f034d1dd6bc526cd59e63a82fe8bb9ef4c"}, - {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c86229333cabaaa8c51cf971496f10318c4734cf7b641f08af0a6fbf17ca3054"}, - {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:c0727bda6e38144d464daec31dff936a82917f431d9c39c39c60a26567eae3ed"}, - {file = "pydantic-1.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:dee5ef83a76ac31ab0c78c10bd7d5437bfdb6358c95b91f1ba7ff7b76f9996a1"}, - {file = "pydantic-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9c9bdb3af48e242838f9f6e6127de9be7063aad17b32215ccc36a09c5cf1070"}, - {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee7e3209db1e468341ef41fe263eb655f67f5c5a76c924044314e139a1103a2"}, - {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b6037175234850ffd094ca77bf60fb54b08b5b22bc85865331dd3bda7a02fa1"}, - {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b2571db88c636d862b35090ccf92bf24004393f85c8870a37f42d9f23d13e032"}, - {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8b5ac0f1c83d31b324e57a273da59197c83d1bb18171e512908fe5dc7278a1d6"}, - {file = "pydantic-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bbbc94d0c94dd80b3340fc4f04fd4d701f4b038ebad72c39693c794fd3bc2d9d"}, - {file = "pydantic-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e0896200b6a40197405af18828da49f067c2fa1f821491bc8f5bde241ef3f7d7"}, - {file = "pydantic-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bdfdadb5994b44bd5579cfa7c9b0e1b0e540c952d56f627eb227851cda9db77"}, - {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:574936363cd4b9eed8acdd6b80d0143162f2eb654d96cb3a8ee91d3e64bf4cf9"}, - {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c556695b699f648c58373b542534308922c46a1cda06ea47bc9ca45ef5b39ae6"}, - {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f947352c3434e8b937e3aa8f96f47bdfe6d92779e44bb3f41e4c213ba6a32145"}, - {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5e48ef4a8b8c066c4a31409d91d7ca372a774d0212da2787c0d32f8045b1e034"}, - {file = "pydantic-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:96f240bce182ca7fe045c76bcebfa0b0534a1bf402ed05914a6f1dadff91877f"}, - {file = "pydantic-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:815ddebb2792efd4bba5488bc8fde09c29e8ca3227d27cf1c6990fc830fd292b"}, - {file = "pydantic-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c5b77947b9e85a54848343928b597b4f74fc364b70926b3c4441ff52620640c"}, - {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c68c3bc88dbda2a6805e9a142ce84782d3930f8fdd9655430d8576315ad97ce"}, - {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a79330f8571faf71bf93667d3ee054609816f10a259a109a0738dac983b23c3"}, - {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5a64b64ddf4c99fe201ac2724daada8595ada0d102ab96d019c1555c2d6441d"}, - {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a733965f1a2b4090a5238d40d983dcd78f3ecea221c7af1497b845a9709c1721"}, - {file = "pydantic-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cc6a4cb8a118ffec2ca5fcb47afbacb4f16d0ab8b7350ddea5e8ef7bcc53a16"}, - {file = "pydantic-1.9.0-py3-none-any.whl", hash = "sha256:085ca1de245782e9b46cefcf99deecc67d418737a1fd3f6a4f511344b613a5b3"}, - {file = "pydantic-1.9.0.tar.gz", hash = "sha256:742645059757a56ecd886faf4ed2441b9c0cd406079c2b4bee51bcc3fbcd510a"}, + {file = "pydantic-1.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8098a724c2784bf03e8070993f6d46aa2eeca031f8d8a048dff277703e6e193"}, + {file = "pydantic-1.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c320c64dd876e45254bdd350f0179da737463eea41c43bacbee9d8c9d1021f11"}, + {file = "pydantic-1.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f3e912f9ad1bdec27fb06b8198a2ccc32f201e24174cec1b3424dda605a310"}, + {file = "pydantic-1.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11951b404e08b01b151222a1cb1a9f0a860a8153ce8334149ab9199cd198131"}, + {file = "pydantic-1.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8bc541a405423ce0e51c19f637050acdbdf8feca34150e0d17f675e72d119580"}, + {file = "pydantic-1.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e565a785233c2d03724c4dc55464559639b1ba9ecf091288dd47ad9c629433bd"}, + {file = "pydantic-1.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:a4a88dcd6ff8fd47c18b3a3709a89adb39a6373f4482e04c1b765045c7e282fd"}, + {file = "pydantic-1.9.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:447d5521575f18e18240906beadc58551e97ec98142266e521c34968c76c8761"}, + {file = "pydantic-1.9.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:985ceb5d0a86fcaa61e45781e567a59baa0da292d5ed2e490d612d0de5796918"}, + {file = "pydantic-1.9.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059b6c1795170809103a1538255883e1983e5b831faea6558ef873d4955b4a74"}, + {file = "pydantic-1.9.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d12f96b5b64bec3f43c8e82b4aab7599d0157f11c798c9f9c528a72b9e0b339a"}, + {file = "pydantic-1.9.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ae72f8098acb368d877b210ebe02ba12585e77bd0db78ac04a1ee9b9f5dd2166"}, + {file = "pydantic-1.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:79b485767c13788ee314669008d01f9ef3bc05db9ea3298f6a50d3ef596a154b"}, + {file = "pydantic-1.9.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:494f7c8537f0c02b740c229af4cb47c0d39840b829ecdcfc93d91dcbb0779892"}, + {file = "pydantic-1.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0f047e11febe5c3198ed346b507e1d010330d56ad615a7e0a89fae604065a0e"}, + {file = "pydantic-1.9.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:969dd06110cb780da01336b281f53e2e7eb3a482831df441fb65dd30403f4608"}, + {file = "pydantic-1.9.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:177071dfc0df6248fd22b43036f936cfe2508077a72af0933d0c1fa269b18537"}, + {file = "pydantic-1.9.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9bcf8b6e011be08fb729d110f3e22e654a50f8a826b0575c7196616780683380"}, + {file = "pydantic-1.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a955260d47f03df08acf45689bd163ed9df82c0e0124beb4251b1290fa7ae728"}, + {file = "pydantic-1.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9ce157d979f742a915b75f792dbd6aa63b8eccaf46a1005ba03aa8a986bde34a"}, + {file = "pydantic-1.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0bf07cab5b279859c253d26a9194a8906e6f4a210063b84b433cf90a569de0c1"}, + {file = "pydantic-1.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d93d4e95eacd313d2c765ebe40d49ca9dd2ed90e5b37d0d421c597af830c195"}, + {file = "pydantic-1.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1542636a39c4892c4f4fa6270696902acb186a9aaeac6f6cf92ce6ae2e88564b"}, + {file = "pydantic-1.9.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a9af62e9b5b9bc67b2a195ebc2c2662fdf498a822d62f902bf27cccb52dbbf49"}, + {file = "pydantic-1.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fe4670cb32ea98ffbf5a1262f14c3e102cccd92b1869df3bb09538158ba90fe6"}, + {file = "pydantic-1.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:9f659a5ee95c8baa2436d392267988fd0f43eb774e5eb8739252e5a7e9cf07e0"}, + {file = "pydantic-1.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b83ba3825bc91dfa989d4eed76865e71aea3a6ca1388b59fc801ee04c4d8d0d6"}, + {file = "pydantic-1.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1dd8fecbad028cd89d04a46688d2fcc14423e8a196d5b0a5c65105664901f810"}, + {file = "pydantic-1.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02eefd7087268b711a3ff4db528e9916ac9aa18616da7bca69c1871d0b7a091f"}, + {file = "pydantic-1.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7eb57ba90929bac0b6cc2af2373893d80ac559adda6933e562dcfb375029acee"}, + {file = "pydantic-1.9.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4ce9ae9e91f46c344bec3b03d6ee9612802682c1551aaf627ad24045ce090761"}, + {file = "pydantic-1.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:72ccb318bf0c9ab97fc04c10c37683d9eea952ed526707fabf9ac5ae59b701fd"}, + {file = "pydantic-1.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:61b6760b08b7c395975d893e0b814a11cf011ebb24f7d869e7118f5a339a82e1"}, + {file = "pydantic-1.9.1-py3-none-any.whl", hash = "sha256:4988c0f13c42bfa9ddd2fe2f569c9d54646ce84adc5de84228cfe83396f3bd58"}, + {file = "pydantic-1.9.1.tar.gz", hash = "sha256:1ed987c3ff29fff7fd8c3ea3a3ea877ad310aae2ef9889a119e22d3f2db0691a"}, ] pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, + {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, + {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, ] pyjsg = [ {file = "PyJSG-0.11.10-py3-none-any.whl", hash = "sha256:10af60ff42219be7e85bf7f11c19b648715b0b29eb2ddbd269e87069a7c3f26d"}, {file = "PyJSG-0.11.10.tar.gz", hash = "sha256:4bd6e3ff2833fa2b395bbe803a2d72a5f0bab5b7285bccd0da1a1bc0aee88bfa"}, ] pypandoc = [ - {file = "pypandoc-1.7.5.tar.gz", hash = "sha256:802c26aae17b64136c6d006949d8ce183a7d4d9fbd4f2d051e66f4fb9f45ca50"}, + {file = "pypandoc-1.8.1-py3-none-any.whl", hash = "sha256:3d7eda399f9169f16106362c55a8f12f30ab0575cfd2cdc6e1856b214cc4c38c"}, + {file = "pypandoc-1.8.1.tar.gz", hash = "sha256:8c1b651d338e8441843b991835f59d561a8473cfe63f0126d330fdb3cb518809"}, ] pyparsing = [ - {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, - {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pyrsistent = [ {file = "pyrsistent-0.18.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1"}, @@ -2171,8 +2816,8 @@ pyshexc = [ {file = "PyShExC-0.9.1.tar.gz", hash = "sha256:35a9975d4b9afeb20ef710fb6680871756381d0c39fbb5470b3b506581a304d3"}, ] pystow = [ - {file = "pystow-0.4.2-py3-none-any.whl", hash = "sha256:61f7c3a615b2c150cbf56c418abddb9e497286e3939d5da97d3d579bfb41e377"}, - {file = "pystow-0.4.2.tar.gz", hash = "sha256:e4b1922a8f4190f0e9f96cbd90126482b271836962443db696fa92d016fdef2e"}, + {file = "pystow-0.4.3-py3-none-any.whl", hash = "sha256:a6315cd54304fbaf32f64de910b9d4e98bd65d970c6cf4da601d3dc3784c03e3"}, + {file = "pystow-0.4.3.tar.gz", hash = "sha256:4c206bc80cfb9de4c6a2de1c2d92a21da11ae57df862da459e56ba524ba514e3"}, ] pytest = [ {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, @@ -2229,6 +2874,9 @@ quantulum3 = [ {file = "quantulum3-0.7.10-py3-none-any.whl", hash = "sha256:1eda716f4d2237bbb70da7cbad3233f005eafb447d8bf8f22d9b38c46856db6d"}, {file = "quantulum3-0.7.10.tar.gz", hash = "sha256:7064d66f20825edcbaac04bf6b02adc3fe64484407fca8ae6d5dec51e895d92e"}, ] +ratelimit = [ + {file = "ratelimit-2.2.1.tar.gz", hash = "sha256:af8a9b64b821529aca09ebaf6d8d279100d766f19e90b5059ac6a718ca6dee42"}, +] rdflib = [ {file = "rdflib-6.0.2-py3-none-any.whl", hash = "sha256:b7642daac8cdad1ba157fecb236f5d1b2aa1de64e714dcee80d65e2b794d88a6"}, {file = "rdflib-6.0.2.tar.gz", hash = "sha256:6136ae056001474ee2aff5fc5b956e62a11c3a9c66bb0f3d9c0aaa5fbb56854e"}, @@ -2245,6 +2893,10 @@ readme-renderer = [ {file = "readme_renderer-35.0-py3-none-any.whl", hash = "sha256:73b84905d091c31f36e50b4ae05ae2acead661f6a09a9abb4df7d2ddcdb6a698"}, {file = "readme_renderer-35.0.tar.gz", hash = "sha256:a727999acfc222fc21d82a12ed48c957c4989785e5865807c65a487d21677497"}, ] +recommonmark = [ + {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, + {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, +] requests = [ {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, @@ -2262,8 +2914,8 @@ rfc3987 = [ {file = "rfc3987-1.3.8.tar.gz", hash = "sha256:d3c4d257a560d544e9826b38bc81db676890c79ab9d7ac92b39c7a253d5ca733"}, ] rich = [ - {file = "rich-12.2.0-py3-none-any.whl", hash = "sha256:c50f3d253bc6a9bb9c79d61a26d510d74abdf1b16881260fab5edfc3edfb082f"}, - {file = "rich-12.2.0.tar.gz", hash = "sha256:ea74bc9dad9589d8eea3e3fd0b136d8bf6e428888955f215824c2894f0da8b47"}, + {file = "rich-12.4.1-py3-none-any.whl", hash = "sha256:d13c6c90c42e24eb7ce660db397e8c398edd58acb7f92a2a88a95572b838aaa4"}, + {file = "rich-12.4.1.tar.gz", hash = "sha256:d239001c0fb7de985e21ec9a4bb542b5150350330bbc1849f835b9cbc8923b91"}, ] "ruamel.yaml" = [ {file = "ruamel.yaml-0.17.21-py3-none-any.whl", hash = "sha256:742b35d3d665023981bd6d16b3d24248ce5df75fdb4e2924e93a05c1f8b61ca7"}, @@ -2296,10 +2948,55 @@ rich = [ {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:825d5fccef6da42f3c8eccd4281af399f21c02b32d98e113dbc631ea6a6ecbc7"}, {file = "ruamel.yaml.clib-0.2.6.tar.gz", hash = "sha256:4ff604ce439abb20794f05613c374759ce10e3595d1867764dd1ae675b85acbd"}, ] +scikit-learn = [ + {file = "scikit-learn-1.1.1.tar.gz", hash = "sha256:3e77b71e8e644f86c8b5be7f1c285ef597de4c384961389ee3e9ca36c445b256"}, + {file = "scikit_learn-1.1.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:102f51797cd8944bf44a038d106848ddf2804f2c1edf7aea45fba81a4fdc4d80"}, + {file = "scikit_learn-1.1.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:723cdb278b1fa57a55f68945bc4e501a2f12abe82f76e8d21e1806cbdbef6fc5"}, + {file = "scikit_learn-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33cf061ed0b79d647a3e4c3f6c52c412172836718a7cd4d11c1318d083300133"}, + {file = "scikit_learn-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47464c110eaa9ed9d1fe108cb403510878c3d3a40f110618d2a19b2190a3e35c"}, + {file = "scikit_learn-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:542ccd2592fe7ad31f5c85fed3a3deb3e252383960a85e4b49a629353fffaba4"}, + {file = "scikit_learn-1.1.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:3be10d8d325821ca366d4fe7083d87c40768f842f54371a9c908d97c45da16fc"}, + {file = "scikit_learn-1.1.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:b2db720e13e697d912a87c1a51194e6fb085dc6d8323caa5ca51369ca6948f78"}, + {file = "scikit_learn-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e851f8874398dcd50d1e174e810e9331563d189356e945b3271c0e19ee6f4d6f"}, + {file = "scikit_learn-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b928869072366dc138762fe0929e7dc88413f8a469aebc6a64adc10a9226180c"}, + {file = "scikit_learn-1.1.1-cp38-cp38-win32.whl", hash = "sha256:e9d228ced1214d67904f26fb820c8abbea12b2889cd4aa8cda20a4ca0ed781c1"}, + {file = "scikit_learn-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:f2d5b5d6e87d482e17696a7bfa03fe9515fdfe27e462a4ad37f3d7774a5e2fd6"}, + {file = "scikit_learn-1.1.1-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:0403ad13f283e27d43b0ad875f187ec7f5d964903d92d1ed06c51439560ecea0"}, + {file = "scikit_learn-1.1.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8fe80df08f5b9cee5dd008eccc672e543976198d790c07e5337f7dfb67eaac05"}, + {file = "scikit_learn-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ff56d07b9507fbe07ca0f4e5c8f3e171f74a429f998da03e308166251316b34"}, + {file = "scikit_learn-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2dad2bfc502344b869d4a3f4aa7271b2a5f4fe41f7328f404844c51612e2c58"}, + {file = "scikit_learn-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22145b60fef02e597a8e7f061ebc7c51739215f11ce7fcd2ca9af22c31aa9f86"}, + {file = "scikit_learn-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:45c0f6ae523353f1d99b85469d746f9c497410adff5ba8b24423705b6956a86e"}, +] +scipy = [ + {file = "scipy-1.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a15a1f3fc0abff33e792d6049161b7795909b40b97c6cc2934ed54384017ab76"}, + {file = "scipy-1.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e79570979ccdc3d165456dd62041d9556fb9733b86b4b6d818af7a0afc15f092"}, + {file = "scipy-1.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a423533c55fec61456dedee7b6ee7dce0bb6bfa395424ea374d25afa262be261"}, + {file = "scipy-1.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:33d6b7df40d197bdd3049d64e8e680227151673465e5d85723b3b8f6b15a6ced"}, + {file = "scipy-1.6.1-cp37-cp37m-win32.whl", hash = "sha256:6725e3fbb47da428794f243864f2297462e9ee448297c93ed1dcbc44335feb78"}, + {file = "scipy-1.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:5fa9c6530b1661f1370bcd332a1e62ca7881785cc0f80c0d559b636567fab63c"}, + {file = "scipy-1.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd50daf727f7c195e26f27467c85ce653d41df4358a25b32434a50d8870fc519"}, + {file = "scipy-1.6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f46dd15335e8a320b0fb4685f58b7471702234cba8bb3442b69a3e1dc329c345"}, + {file = "scipy-1.6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0e5b0ccf63155d90da576edd2768b66fb276446c371b73841e3503be1d63fb5d"}, + {file = "scipy-1.6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2481efbb3740977e3c831edfd0bd9867be26387cacf24eb5e366a6a374d3d00d"}, + {file = "scipy-1.6.1-cp38-cp38-win32.whl", hash = "sha256:68cb4c424112cd4be886b4d979c5497fba190714085f46b8ae67a5e4416c32b4"}, + {file = "scipy-1.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:5f331eeed0297232d2e6eea51b54e8278ed8bb10b099f69c44e2558c090d06bf"}, + {file = "scipy-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8a51d33556bf70367452d4d601d1742c0e806cd0194785914daf19775f0e67"}, + {file = "scipy-1.6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:83bf7c16245c15bc58ee76c5418e46ea1811edcc2e2b03041b804e46084ab627"}, + {file = "scipy-1.6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:794e768cc5f779736593046c9714e0f3a5940bc6dcc1dba885ad64cbfb28e9f0"}, + {file = "scipy-1.6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5da5471aed911fe7e52b86bf9ea32fb55ae93e2f0fac66c32e58897cfb02fa07"}, + {file = "scipy-1.6.1-cp39-cp39-win32.whl", hash = "sha256:8e403a337749ed40af60e537cc4d4c03febddcc56cd26e774c9b1b600a70d3e4"}, + {file = "scipy-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a5193a098ae9f29af283dcf0041f762601faf2e595c0db1da929875b7570353f"}, + {file = "scipy-1.6.1.tar.gz", hash = "sha256:c4fceb864890b6168e79b0e714c585dbe2fd4222768ee90bc1aa0f8218691b11"}, +] secretstorage = [ {file = "SecretStorage-3.3.2-py3-none-any.whl", hash = "sha256:755dc845b6ad76dcbcbc07ea3da75ae54bb1ea529eb72d15f83d26499a5df319"}, {file = "SecretStorage-3.3.2.tar.gz", hash = "sha256:0a8eb9645b320881c222e827c26f4cfcf55363e8b374a021981ef886657a912f"}, ] +semsql = [ + {file = "semsql-0.1.3-py3-none-any.whl", hash = "sha256:d94f7d95f9ce545bf99b712ea2952d535ca1d1c43391b0af1fe9bfccd3178d00"}, + {file = "semsql-0.1.3.tar.gz", hash = "sha256:274129e95d72181600424a84b0bddd9aaf11f8be50096d9da49fb79ddba2aeb8"}, +] shexjsg = [ {file = "ShExJSG-0.8.2-py2.py3-none-any.whl", hash = "sha256:3b0d8432dd313bee9e1343382c5e02e9908dd941a7dd7342bf8c0200fe523766"}, {file = "ShExJSG-0.8.2.tar.gz", hash = "sha256:f17a629fc577fa344382bdee143cd9ff86588537f9f811f66cea6f63cdbcd0b6"}, @@ -2367,47 +3064,58 @@ sphinxcontrib-serializinghtml = [ {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, ] sqlalchemy = [ - {file = "SQLAlchemy-1.4.35-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:093b3109c2747d5dc0fa4314b1caf4c7ca336d5c8c831e3cfbec06a7e861e1e6"}, - {file = "SQLAlchemy-1.4.35-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6fb6b9ed1d0be7fa2c90be8ad2442c14cbf84eb0709dd1afeeff1e511550041"}, - {file = "SQLAlchemy-1.4.35-cp27-cp27m-win32.whl", hash = "sha256:d38a49aa75a5759d0d118e26701d70c70a37b896379115f8386e91b0444bfa70"}, - {file = "SQLAlchemy-1.4.35-cp27-cp27m-win_amd64.whl", hash = "sha256:70e571ae9ee0ff36ed37e2b2765445d54981e4d600eccdf6fe3838bc2538d157"}, - {file = "SQLAlchemy-1.4.35-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:48036698f20080462e981b18d77d574631a3d1fc2c33b416c6df299ec1d10b99"}, - {file = "SQLAlchemy-1.4.35-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:4ba2c1f368bcf8551cdaa27eac525022471015633d5bdafbc4297e0511f62f51"}, - {file = "SQLAlchemy-1.4.35-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d17316100fcd0b6371ac9211351cb976fd0c2e12a859c1a57965e3ef7f3ed2bc"}, - {file = "SQLAlchemy-1.4.35-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9837133b89ad017e50a02a3b46419869cf4e9aa02743e911b2a9e25fa6b05403"}, - {file = "SQLAlchemy-1.4.35-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4efb70a62cbbbc052c67dc66b5448b0053b509732184af3e7859d05fdf6223c"}, - {file = "SQLAlchemy-1.4.35-cp310-cp310-win32.whl", hash = "sha256:1ff9f84b2098ef1b96255a80981ee10f4b5d49b6cfeeccf9632c2078cd86052e"}, - {file = "SQLAlchemy-1.4.35-cp310-cp310-win_amd64.whl", hash = "sha256:48f0eb5bcc87a9b2a95b345ed18d6400daaa86ca414f6840961ed85c342af8f4"}, - {file = "SQLAlchemy-1.4.35-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da25e75ba9f3fabc271673b6b413ca234994e6d3453424bea36bb5549c5bbaec"}, - {file = "SQLAlchemy-1.4.35-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeea6ace30603ca9a8869853bb4a04c7446856d7789e36694cd887967b7621f6"}, - {file = "SQLAlchemy-1.4.35-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a5dbdbb39c1b100df4d182c78949158073ca46ba2850c64fe02ffb1eb5b70903"}, - {file = "SQLAlchemy-1.4.35-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfd8e4c64c30a5219032e64404d468c425bdbc13b397da906fc9bee6591fc0dd"}, - {file = "SQLAlchemy-1.4.35-cp36-cp36m-win32.whl", hash = "sha256:9dac1924611698f8fe5b2e58601156c01da2b6c0758ba519003013a78280cf4d"}, - {file = "SQLAlchemy-1.4.35-cp36-cp36m-win_amd64.whl", hash = "sha256:e8b09e2d90267717d850f2e2323919ea32004f55c40e5d53b41267e382446044"}, - {file = "SQLAlchemy-1.4.35-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:63c82c9e8ccc2fb4bfd87c24ffbac320f70b7c93b78f206c1f9c441fa3013a5f"}, - {file = "SQLAlchemy-1.4.35-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:effadcda9a129cc56408dd5b2ea20ee9edcea24bd58e6a1489fa27672d733182"}, - {file = "SQLAlchemy-1.4.35-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2c6c411d8c59afba95abccd2b418f30ade674186660a2d310d364843049fb2c1"}, - {file = "SQLAlchemy-1.4.35-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2489e70bfa2356f2d421106794507daccf6cc8711753c442fc97272437fc606"}, - {file = "SQLAlchemy-1.4.35-cp37-cp37m-win32.whl", hash = "sha256:186cb3bd77abf2ddcf722f755659559bfb157647b3fd3f32ea1c70e8311e8f6b"}, - {file = "SQLAlchemy-1.4.35-cp37-cp37m-win_amd64.whl", hash = "sha256:babd63fb7cb6b0440abb6d16aca2be63342a6eea3dc7b613bb7a9357dc36920f"}, - {file = "SQLAlchemy-1.4.35-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:9e1a72197529ea00357640f21d92ffc7024e156ef9ac36edf271c8335facbc1a"}, - {file = "SQLAlchemy-1.4.35-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e255a8dd5572b0c66d6ee53597d36157ad6cf3bc1114f61c54a65189f996ab03"}, - {file = "SQLAlchemy-1.4.35-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9bec63b1e20ef69484f530fb4b4837e050450637ff9acd6dccc7003c5013abf8"}, - {file = "SQLAlchemy-1.4.35-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95411abc0e36d18f54fa5e24d42960ea3f144fb16caaa5a8c2e492b5424cc82c"}, - {file = "SQLAlchemy-1.4.35-cp38-cp38-win32.whl", hash = "sha256:28b17ebbaee6587013be2f78dc4f6e95115e1ec8dd7647c4e7be048da749e48b"}, - {file = "SQLAlchemy-1.4.35-cp38-cp38-win_amd64.whl", hash = "sha256:9e7094cf04e6042c4210a185fa7b9b8b3b789dd6d1de7b4f19452290838e48bd"}, - {file = "SQLAlchemy-1.4.35-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:1b4eac3933c335d7f375639885765722534bb4e52e51cdc01a667eea822af9b6"}, - {file = "SQLAlchemy-1.4.35-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d8edfb09ed2b865485530c13e269833dab62ab2d582fde21026c9039d4d0e62"}, - {file = "SQLAlchemy-1.4.35-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6204d06bfa85f87625e1831ca663f9dba91ac8aec24b8c65d02fb25cbaf4b4d7"}, - {file = "SQLAlchemy-1.4.35-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28aa2ef06c904729620cc735262192e622db9136c26d8587f71f29ec7715628a"}, - {file = "SQLAlchemy-1.4.35-cp39-cp39-win32.whl", hash = "sha256:ecc81336b46e31ae9c9bdfa220082079914e31a476d088d3337ecf531d861228"}, - {file = "SQLAlchemy-1.4.35-cp39-cp39-win_amd64.whl", hash = "sha256:53c7469b86a60fe2babca4f70111357e6e3d5150373bc85eb3b914356983e89a"}, - {file = "SQLAlchemy-1.4.35.tar.gz", hash = "sha256:2ffc813b01dc6473990f5e575f210ca5ac2f5465ace3908b78ffd6d20058aab5"}, + {file = "SQLAlchemy-1.4.36-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:81e53bd383c2c33de9d578bfcc243f559bd3801a0e57f2bcc9a943c790662e0c"}, + {file = "SQLAlchemy-1.4.36-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6e1fe00ee85c768807f2a139b83469c1e52a9ffd58a6eb51aa7aeb524325ab18"}, + {file = "SQLAlchemy-1.4.36-cp27-cp27m-win32.whl", hash = "sha256:d57ac32f8dc731fddeb6f5d1358b4ca5456e72594e664769f0a9163f13df2a31"}, + {file = "SQLAlchemy-1.4.36-cp27-cp27m-win_amd64.whl", hash = "sha256:fca8322e04b2dde722fcb0558682740eebd3bd239bea7a0d0febbc190e99dc15"}, + {file = "SQLAlchemy-1.4.36-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:53d2d9ee93970c969bc4e3c78b1277d7129554642f6ffea039c282c7dc4577bc"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:f0394a3acfb8925db178f7728adb38c027ed7e303665b225906bfa8099dc1ce8"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c606d8238feae2f360b8742ffbe67741937eb0a05b57f536948d198a3def96"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8d07fe2de0325d06e7e73281e9a9b5e259fbd7cbfbe398a0433cbb0082ad8fa7"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5041474dcab7973baa91ec1f3112049a9dd4652898d6a95a6a895ff5c58beb6b"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-win32.whl", hash = "sha256:be094460930087e50fd08297db9d7aadaed8408ad896baf758e9190c335632da"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-win_amd64.whl", hash = "sha256:64d796e9af522162f7f2bf7a3c5531a0a550764c426782797bbeed809d0646c5"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a0ae3aa2e86a4613f2d4c49eb7da23da536e6ce80b2bfd60bbb2f55fc02b0b32"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d50cb71c1dbed70646d521a0975fb0f92b7c3f84c61fa59e07be23a1aaeecfc"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:16abf35af37a3d5af92725fc9ec507dd9e9183d261c2069b6606d60981ed1c6e"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864a83bd345871ad9699ce466388f836db7572003d67d9392a71998092210e3"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-win32.whl", hash = "sha256:fbf8c09fe9728168f8cc1b40c239eab10baf9c422c18be7f53213d70434dea43"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-win_amd64.whl", hash = "sha256:6e859fa96605027bd50d8e966db1c4e1b03e7b3267abbc4b89ae658c99393c58"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:166a3887ec355f7d2f12738f7fa25dc8ac541867147a255f790f2f41f614cb44"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e885548da361aa3f8a9433db4cfb335b2107e533bf314359ae3952821d84b3e"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5c90ef955d429966d84326d772eb34333178737ebb669845f1d529eb00c75e72"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a052bd9f53004f8993c624c452dfad8ec600f572dd0ed0445fbe64b22f5570e"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-win32.whl", hash = "sha256:dce3468bf1fc12374a1a732c9efd146ce034f91bb0482b602a9311cb6166a920"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-win_amd64.whl", hash = "sha256:6cb4c4f57a20710cea277edf720d249d514e587f796b75785ad2c25e1c0fed26"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e74ce103b81c375c3853b436297952ef8d7863d801dcffb6728d01544e5191b5"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b20c4178ead9bc398be479428568ff31b6c296eb22e75776273781a6551973f"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:af2587ae11400157753115612d6c6ad255143efba791406ad8a0cbcccf2edcb3"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83cf3077712be9f65c9aaa0b5bc47bc1a44789fd45053e2e3ecd59ff17c63fe9"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-win32.whl", hash = "sha256:ce20f5da141f8af26c123ebaa1b7771835ca6c161225ce728962a79054f528c3"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-win_amd64.whl", hash = "sha256:316c7e5304dda3e3ad711569ac5d02698bbc71299b168ac56a7076b86259f7ea"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:f522214f6749bc073262529c056f7dfd660f3b5ec4180c5354d985eb7219801e"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ecac4db8c1aa4a269f5829df7e706639a24b780d2ac46b3e485cbbd27ec0028"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3db741beaa983d4cbf9087558620e7787106319f7e63a066990a70657dd6b35"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ec89bf98cc6a0f5d1e28e3ad28e9be6f3b4bdbd521a4053c7ae8d5e1289a8a1"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-win32.whl", hash = "sha256:e12532c4d3f614678623da5d852f038ace1f01869b89f003ed6fe8c793f0c6a3"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-win_amd64.whl", hash = "sha256:cb441ca461bf97d00877b607f132772644b623518b39ced54da433215adce691"}, + {file = "SQLAlchemy-1.4.36.tar.gz", hash = "sha256:64678ac321d64a45901ef2e24725ec5e783f1f4a588305e196431447e7ace243"}, +] +sqlalchemy-utils = [ + {file = "SQLAlchemy-Utils-0.38.2.tar.gz", hash = "sha256:9e01d6d3fb52d3926fcd4ea4a13f3540701b751aced0316bff78264402c2ceb4"}, + {file = "SQLAlchemy_Utils-0.38.2-py3-none-any.whl", hash = "sha256:622235b1598f97300e4d08820ab024f5219c9a6309937a8b908093f487b4ba54"}, +] +sssom = [ + {file = "sssom-0.3.11.tar.gz", hash = "sha256:d191211d714eb732e4c66c78c03b582a7315ca1be1bed9706747d0e76c44e5fe"}, ] strsimpy = [ {file = "strsimpy-0.2.1-py3-none-any.whl", hash = "sha256:d676a440d5d3dbcf5ba92d01814a03a218776ce07bd7a8185da7019e04cf9ba7"}, {file = "strsimpy-0.2.1.tar.gz", hash = "sha256:0842eb57f7af86c882a59a1bc8721ec2580a267e563fd0503ced2972040372c9"}, ] +threadpoolctl = [ + {file = "threadpoolctl-3.1.0-py3-none-any.whl", hash = "sha256:8b99adda265feb6773280df41eece7b2e6561b772d21ffd52e372f999024907b"}, + {file = "threadpoolctl-3.1.0.tar.gz", hash = "sha256:a335baacfaa4400ae1f0d8e3a58d6674d2f8828e3716bb2802c44955ad391380"}, +] tomli = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, @@ -2428,101 +3136,179 @@ urllib3 = [ {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, ] +validators = [ + {file = "validators-0.19.0.tar.gz", hash = "sha256:dec45f4381f042f1e705cfa74949505b77f1e27e8b05409096fee8152c839cbe"}, +] watchdog = [ - {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:177bae28ca723bc00846466016d34f8c1d6a621383b6caca86745918d55c7383"}, - {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d1cf7dfd747dec519486a98ef16097e6c480934ef115b16f18adb341df747a4"}, - {file = "watchdog-2.1.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7f14ce6adea2af1bba495acdde0e510aecaeb13b33f7bd2f6324e551b26688ca"}, - {file = "watchdog-2.1.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4d0e98ac2e8dd803a56f4e10438b33a2d40390a72750cff4939b4b274e7906fa"}, - {file = "watchdog-2.1.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:81982c7884aac75017a6ecc72f1a4fedbae04181a8665a34afce9539fc1b3fab"}, - {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0b4a1fe6201c6e5a1926f5767b8664b45f0fcb429b62564a41f490ff1ce1dc7a"}, - {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6e6ae29b72977f2e1ee3d0b760d7ee47896cb53e831cbeede3e64485e5633cc8"}, - {file = "watchdog-2.1.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b9777664848160449e5b4260e0b7bc1ae0f6f4992a8b285db4ec1ef119ffa0e2"}, - {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:19b36d436578eb437e029c6b838e732ed08054956366f6dd11875434a62d2b99"}, - {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b61acffaf5cd5d664af555c0850f9747cc5f2baf71e54bbac164c58398d6ca7b"}, - {file = "watchdog-2.1.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1e877c70245424b06c41ac258023ea4bd0c8e4ff15d7c1368f17cd0ae6e351dd"}, - {file = "watchdog-2.1.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d802d65262a560278cf1a65ef7cae4e2bc7ecfe19e5451349e4c67e23c9dc420"}, - {file = "watchdog-2.1.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b3750ee5399e6e9c69eae8b125092b871ee9e2fcbd657a92747aea28f9056a5c"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_aarch64.whl", hash = "sha256:ed6d9aad09a2a948572224663ab00f8975fae242aa540509737bb4507133fa2d"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_armv7l.whl", hash = "sha256:b26e13e8008dcaea6a909e91d39b629a39635d1a8a7239dd35327c74f4388601"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_i686.whl", hash = "sha256:0908bb50f6f7de54d5d31ec3da1654cb7287c6b87bce371954561e6de379d690"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64.whl", hash = "sha256:bdcbf75580bf4b960fb659bbccd00123d83119619195f42d721e002c1621602f"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:81a5861d0158a7e55fe149335fb2bbfa6f48cbcbd149b52dbe2cd9a544034bbd"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_s390x.whl", hash = "sha256:03b43d583df0f18782a0431b6e9e9965c5b3f7cf8ec36a00b930def67942c385"}, - {file = "watchdog-2.1.7-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ae934e34c11aa8296c18f70bf66ed60e9870fcdb4cc19129a04ca83ab23e7055"}, - {file = "watchdog-2.1.7-py3-none-win32.whl", hash = "sha256:49639865e3db4be032a96695c98ac09eed39bbb43fe876bb217da8f8101689a6"}, - {file = "watchdog-2.1.7-py3-none-win_amd64.whl", hash = "sha256:340b875aecf4b0e6672076a6f05cfce6686935559bb6d34cebedee04126a9566"}, - {file = "watchdog-2.1.7-py3-none-win_ia64.whl", hash = "sha256:351e09b6d9374d5bcb947e6ac47a608ec25b9d70583e9db00b2fcdb97b00b572"}, - {file = "watchdog-2.1.7.tar.gz", hash = "sha256:3fd47815353be9c44eebc94cc28fe26b2b0c5bd889dafc4a5a7cbdf924143480"}, + {file = "watchdog-2.1.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:676263bee67b165f16b05abc52acc7a94feac5b5ab2449b491f1a97638a79277"}, + {file = "watchdog-2.1.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aa68d2d9a89d686fae99d28a6edf3b18595e78f5adf4f5c18fbfda549ac0f20c"}, + {file = "watchdog-2.1.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e2e51c53666850c3ecffe9d265fc5d7351db644de17b15e9c685dd3cdcd6f97"}, + {file = "watchdog-2.1.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7721ac736170b191c50806f43357407138c6748e4eb3e69b071397f7f7aaeedd"}, + {file = "watchdog-2.1.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ce7376aed3da5fd777483fe5ebc8475a440c6d18f23998024f832134b2938e7b"}, + {file = "watchdog-2.1.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f9ee4c6bf3a1b2ed6be90a2d78f3f4bbd8105b6390c04a86eb48ed67bbfa0b0b"}, + {file = "watchdog-2.1.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:68dbe75e0fa1ba4d73ab3f8e67b21770fbed0651d32ce515cd38919a26873266"}, + {file = "watchdog-2.1.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0c520009b8cce79099237d810aaa19bc920941c268578436b62013b2f0102320"}, + {file = "watchdog-2.1.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efcc8cbc1b43902571b3dce7ef53003f5b97fe4f275fe0489565fc6e2ebe3314"}, + {file = "watchdog-2.1.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:746e4c197ec1083581bb1f64d07d1136accf03437badb5ff8fcb862565c193b2"}, + {file = "watchdog-2.1.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ae17b6be788fb8e4d8753d8d599de948f0275a232416e16436363c682c6f850"}, + {file = "watchdog-2.1.8-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ddde157dc1447d8130cb5b8df102fad845916fe4335e3d3c3f44c16565becbb7"}, + {file = "watchdog-2.1.8-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4978db33fc0934c92013ee163a9db158ec216099b69fce5aec790aba704da412"}, + {file = "watchdog-2.1.8-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b962de4d7d92ff78fb2dbc6a0cb292a679dea879a0eb5568911484d56545b153"}, + {file = "watchdog-2.1.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1e5d0fdfaa265c29dc12621913a76ae99656cf7587d03950dfeb3595e5a26102"}, + {file = "watchdog-2.1.8-py3-none-manylinux2014_armv7l.whl", hash = "sha256:036ed15f7cd656351bf4e17244447be0a09a61aaa92014332d50719fc5973bc0"}, + {file = "watchdog-2.1.8-py3-none-manylinux2014_i686.whl", hash = "sha256:2962628a8777650703e8f6f2593065884c602df7bae95759b2df267bd89b2ef5"}, + {file = "watchdog-2.1.8-py3-none-manylinux2014_ppc64.whl", hash = "sha256:156ec3a94695ea68cfb83454b98754af6e276031ba1ae7ae724dc6bf8973b92a"}, + {file = "watchdog-2.1.8-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:47598fe6713fc1fee86b1ca85c9cbe77e9b72d002d6adeab9c3b608f8a5ead10"}, + {file = "watchdog-2.1.8-py3-none-manylinux2014_s390x.whl", hash = "sha256:fed4de6e45a4f16e4046ea00917b4fe1700b97244e5d114f594b4a1b9de6bed8"}, + {file = "watchdog-2.1.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:24dedcc3ce75e150f2a1d704661f6879764461a481ba15a57dc80543de46021c"}, + {file = "watchdog-2.1.8-py3-none-win32.whl", hash = "sha256:6ddf67bc9f413791072e3afb466e46cc72c6799ba73dea18439b412e8f2e3257"}, + {file = "watchdog-2.1.8-py3-none-win_amd64.whl", hash = "sha256:88ef3e8640ef0a64b7ad7394b0f23384f58ac19dd759da7eaa9bc04b2898943f"}, + {file = "watchdog-2.1.8-py3-none-win_ia64.whl", hash = "sha256:0fb60c7d31474b21acba54079ce9ff0136411183e9a591369417cddb1d7d00d7"}, + {file = "watchdog-2.1.8.tar.gz", hash = "sha256:6d03149126864abd32715d4e9267d2754cede25a69052901399356ad3bc5ecff"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] wrapt = [ - {file = "wrapt-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:5a9a1889cc01ed2ed5f34574c90745fab1dd06ec2eee663e8ebeefe363e8efd7"}, - {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:9a3ff5fb015f6feb78340143584d9f8a0b91b6293d6b5cf4295b3e95d179b88c"}, - {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4b847029e2d5e11fd536c9ac3136ddc3f54bc9488a75ef7d040a3900406a91eb"}, - {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:9a5a544861b21e0e7575b6023adebe7a8c6321127bb1d238eb40d99803a0e8bd"}, - {file = "wrapt-1.14.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:88236b90dda77f0394f878324cfbae05ae6fde8a84d548cfe73a75278d760291"}, - {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f0408e2dbad9e82b4c960274214af533f856a199c9274bd4aff55d4634dedc33"}, - {file = "wrapt-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:9d8c68c4145041b4eeae96239802cfdfd9ef927754a5be3f50505f09f309d8c6"}, - {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:22626dca56fd7f55a0733e604f1027277eb0f4f3d95ff28f15d27ac25a45f71b"}, - {file = "wrapt-1.14.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:65bf3eb34721bf18b5a021a1ad7aa05947a1767d1aa272b725728014475ea7d5"}, - {file = "wrapt-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09d16ae7a13cff43660155383a2372b4aa09109c7127aa3f24c3cf99b891c330"}, - {file = "wrapt-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:debaf04f813ada978d7d16c7dfa16f3c9c2ec9adf4656efdc4defdf841fc2f0c"}, - {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748df39ed634851350efa87690c2237a678ed794fe9ede3f0d79f071ee042561"}, - {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1807054aa7b61ad8d8103b3b30c9764de2e9d0c0978e9d3fc337e4e74bf25faa"}, - {file = "wrapt-1.14.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763a73ab377390e2af26042f685a26787c402390f682443727b847e9496e4a2a"}, - {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8529b07b49b2d89d6917cfa157d3ea1dfb4d319d51e23030664a827fe5fd2131"}, - {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:68aeefac31c1f73949662ba8affaf9950b9938b712fb9d428fa2a07e40ee57f8"}, - {file = "wrapt-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59d7d92cee84a547d91267f0fea381c363121d70fe90b12cd88241bd9b0e1763"}, - {file = "wrapt-1.14.0-cp310-cp310-win32.whl", hash = "sha256:3a88254881e8a8c4784ecc9cb2249ff757fd94b911d5df9a5984961b96113fff"}, - {file = "wrapt-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:9a242871b3d8eecc56d350e5e03ea1854de47b17f040446da0e47dc3e0b9ad4d"}, - {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a65bffd24409454b889af33b6c49d0d9bcd1a219b972fba975ac935f17bdf627"}, - {file = "wrapt-1.14.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9d9fcd06c952efa4b6b95f3d788a819b7f33d11bea377be6b8980c95e7d10775"}, - {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:db6a0ddc1282ceb9032e41853e659c9b638789be38e5b8ad7498caac00231c23"}, - {file = "wrapt-1.14.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:14e7e2c5f5fca67e9a6d5f753d21f138398cad2b1159913ec9e9a67745f09ba3"}, - {file = "wrapt-1.14.0-cp35-cp35m-win32.whl", hash = "sha256:6d9810d4f697d58fd66039ab959e6d37e63ab377008ef1d63904df25956c7db0"}, - {file = "wrapt-1.14.0-cp35-cp35m-win_amd64.whl", hash = "sha256:d808a5a5411982a09fef6b49aac62986274ab050e9d3e9817ad65b2791ed1425"}, - {file = "wrapt-1.14.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b77159d9862374da213f741af0c361720200ab7ad21b9f12556e0eb95912cd48"}, - {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36a76a7527df8583112b24adc01748cd51a2d14e905b337a6fefa8b96fc708fb"}, - {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0057b5435a65b933cbf5d859cd4956624df37b8bf0917c71756e4b3d9958b9e"}, - {file = "wrapt-1.14.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0a4ca02752ced5f37498827e49c414d694ad7cf451ee850e3ff160f2bee9d3"}, - {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8c6be72eac3c14baa473620e04f74186c5d8f45d80f8f2b4eda6e1d18af808e8"}, - {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:21b1106bff6ece8cb203ef45b4f5778d7226c941c83aaaa1e1f0f4f32cc148cd"}, - {file = "wrapt-1.14.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:493da1f8b1bb8a623c16552fb4a1e164c0200447eb83d3f68b44315ead3f9036"}, - {file = "wrapt-1.14.0-cp36-cp36m-win32.whl", hash = "sha256:89ba3d548ee1e6291a20f3c7380c92f71e358ce8b9e48161401e087e0bc740f8"}, - {file = "wrapt-1.14.0-cp36-cp36m-win_amd64.whl", hash = "sha256:729d5e96566f44fccac6c4447ec2332636b4fe273f03da128fff8d5559782b06"}, - {file = "wrapt-1.14.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:891c353e95bb11abb548ca95c8b98050f3620a7378332eb90d6acdef35b401d4"}, - {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23f96134a3aa24cc50614920cc087e22f87439053d886e474638c68c8d15dc80"}, - {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6807bcee549a8cb2f38f73f469703a1d8d5d990815c3004f21ddb68a567385ce"}, - {file = "wrapt-1.14.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6915682f9a9bc4cf2908e83caf5895a685da1fbd20b6d485dafb8e218a338279"}, - {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f2f3bc7cd9c9fcd39143f11342eb5963317bd54ecc98e3650ca22704b69d9653"}, - {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3a71dbd792cc7a3d772ef8cd08d3048593f13d6f40a11f3427c000cf0a5b36a0"}, - {file = "wrapt-1.14.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5a0898a640559dec00f3614ffb11d97a2666ee9a2a6bad1259c9facd01a1d4d9"}, - {file = "wrapt-1.14.0-cp37-cp37m-win32.whl", hash = "sha256:167e4793dc987f77fd476862d32fa404d42b71f6a85d3b38cbce711dba5e6b68"}, - {file = "wrapt-1.14.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d066ffc5ed0be00cd0352c95800a519cf9e4b5dd34a028d301bdc7177c72daf3"}, - {file = "wrapt-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d9bdfa74d369256e4218000a629978590fd7cb6cf6893251dad13d051090436d"}, - {file = "wrapt-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2498762814dd7dd2a1d0248eda2afbc3dd9c11537bc8200a4b21789b6df6cd38"}, - {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f24ca7953f2643d59a9c87d6e272d8adddd4a53bb62b9208f36db408d7aafc7"}, - {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b835b86bd5a1bdbe257d610eecab07bf685b1af2a7563093e0e69180c1d4af1"}, - {file = "wrapt-1.14.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b21650fa6907e523869e0396c5bd591cc326e5c1dd594dcdccac089561cacfb8"}, - {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:354d9fc6b1e44750e2a67b4b108841f5f5ea08853453ecbf44c81fdc2e0d50bd"}, - {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1f83e9c21cd5275991076b2ba1cd35418af3504667affb4745b48937e214bafe"}, - {file = "wrapt-1.14.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:61e1a064906ccba038aa3c4a5a82f6199749efbbb3cef0804ae5c37f550eded0"}, - {file = "wrapt-1.14.0-cp38-cp38-win32.whl", hash = "sha256:28c659878f684365d53cf59dc9a1929ea2eecd7ac65da762be8b1ba193f7e84f"}, - {file = "wrapt-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:b0ed6ad6c9640671689c2dbe6244680fe8b897c08fd1fab2228429b66c518e5e"}, - {file = "wrapt-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3f7e671fb19734c872566e57ce7fc235fa953d7c181bb4ef138e17d607dc8a1"}, - {file = "wrapt-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87fa943e8bbe40c8c1ba4086971a6fefbf75e9991217c55ed1bcb2f1985bd3d4"}, - {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4775a574e9d84e0212f5b18886cace049a42e13e12009bb0491562a48bb2b758"}, - {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d57677238a0c5411c76097b8b93bdebb02eb845814c90f0b01727527a179e4d"}, - {file = "wrapt-1.14.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00108411e0f34c52ce16f81f1d308a571df7784932cc7491d1e94be2ee93374b"}, - {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d332eecf307fca852d02b63f35a7872de32d5ba8b4ec32da82f45df986b39ff6"}, - {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:01f799def9b96a8ec1ef6b9c1bbaf2bbc859b87545efbecc4a78faea13d0e3a0"}, - {file = "wrapt-1.14.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47045ed35481e857918ae78b54891fac0c1d197f22c95778e66302668309336c"}, - {file = "wrapt-1.14.0-cp39-cp39-win32.whl", hash = "sha256:2eca15d6b947cfff51ed76b2d60fd172c6ecd418ddab1c5126032d27f74bc350"}, - {file = "wrapt-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:bb36fbb48b22985d13a6b496ea5fb9bb2a076fea943831643836c9f6febbcfdc"}, - {file = "wrapt-1.14.0.tar.gz", hash = "sha256:8323a43bd9c91f62bb7d4be74cc9ff10090e7ef820e27bfe8815c57e68261311"}, + {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, + {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, + {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, + {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, + {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, + {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, + {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, + {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, + {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, + {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, + {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, + {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, + {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, + {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, + {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, + {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, +] +yarl = [ + {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95"}, + {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b"}, + {file = "yarl-1.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1d0894f238763717bdcfea74558c94e3bc34aeacd3351d769460c1a586a8b05"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4b95b7e00c6635a72e2d00b478e8a28bfb122dc76349a06e20792eb53a523"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c145ab54702334c42237a6c6c4cc08703b6aa9b94e2f227ceb3d477d20c36c63"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ca56f002eaf7998b5fcf73b2421790da9d2586331805f38acd9997743114e98"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1d3d5ad8ea96bd6d643d80c7b8d5977b4e2fb1bab6c9da7322616fd26203d125"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:167ab7f64e409e9bdd99333fe8c67b5574a1f0495dcfd905bc7454e766729b9e"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:95a1873b6c0dd1c437fb3bb4a4aaa699a48c218ac7ca1e74b0bee0ab16c7d60d"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6152224d0a1eb254f97df3997d79dadd8bb2c1a02ef283dbb34b97d4f8492d23"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5bb7d54b8f61ba6eee541fba4b83d22b8a046b4ef4d8eb7f15a7e35db2e1e245"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:9c1f083e7e71b2dd01f7cd7434a5f88c15213194df38bc29b388ccdf1492b739"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f44477ae29025d8ea87ec308539f95963ffdc31a82f42ca9deecf2d505242e72"}, + {file = "yarl-1.7.2-cp310-cp310-win32.whl", hash = "sha256:cff3ba513db55cc6a35076f32c4cdc27032bd075c9faef31fec749e64b45d26c"}, + {file = "yarl-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:c9c6d927e098c2d360695f2e9d38870b2e92e0919be07dbe339aefa32a090265"}, + {file = "yarl-1.7.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9b4c77d92d56a4c5027572752aa35082e40c561eec776048330d2907aead891d"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c01a89a44bb672c38f42b49cdb0ad667b116d731b3f4c896f72302ff77d71656"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c19324a1c5399b602f3b6e7db9478e5b1adf5cf58901996fc973fe4fccd73eed"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3abddf0b8e41445426d29f955b24aeecc83fa1072be1be4e0d194134a7d9baee"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6a1a9fe17621af43e9b9fcea8bd088ba682c8192d744b386ee3c47b56eaabb2c"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b0915ee85150963a9504c10de4e4729ae700af11df0dc5550e6587ed7891e92"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:29e0656d5497733dcddc21797da5a2ab990c0cb9719f1f969e58a4abac66234d"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:bf19725fec28452474d9887a128e98dd67eee7b7d52e932e6949c532d820dc3b"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d6f3d62e16c10e88d2168ba2d065aa374e3c538998ed04996cd373ff2036d64c"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ac10bbac36cd89eac19f4e51c032ba6b412b3892b685076f4acd2de18ca990aa"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aa32aaa97d8b2ed4e54dc65d241a0da1c627454950f7d7b1f95b13985afd6c5d"}, + {file = "yarl-1.7.2-cp36-cp36m-win32.whl", hash = "sha256:87f6e082bce21464857ba58b569370e7b547d239ca22248be68ea5d6b51464a1"}, + {file = "yarl-1.7.2-cp36-cp36m-win_amd64.whl", hash = "sha256:ac35ccde589ab6a1870a484ed136d49a26bcd06b6a1c6397b1967ca13ceb3913"}, + {file = "yarl-1.7.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a467a431a0817a292121c13cbe637348b546e6ef47ca14a790aa2fa8cc93df63"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ab0c3274d0a846840bf6c27d2c60ba771a12e4d7586bf550eefc2df0b56b3b4"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d260d4dc495c05d6600264a197d9d6f7fc9347f21d2594926202fd08cf89a8ba"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc4dd8b01a8112809e6b636b00f487846956402834a7fd59d46d4f4267181c41"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c1164a2eac148d85bbdd23e07dfcc930f2e633220f3eb3c3e2a25f6148c2819e"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:67e94028817defe5e705079b10a8438b8cb56e7115fa01640e9c0bb3edf67332"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:89ccbf58e6a0ab89d487c92a490cb5660d06c3a47ca08872859672f9c511fc52"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8cce6f9fa3df25f55521fbb5c7e4a736683148bcc0c75b21863789e5185f9185"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:211fcd65c58bf250fb994b53bc45a442ddc9f441f6fec53e65de8cba48ded986"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c10ea1e80a697cf7d80d1ed414b5cb8f1eec07d618f54637067ae3c0334133c4"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:52690eb521d690ab041c3919666bea13ab9fbff80d615ec16fa81a297131276b"}, + {file = "yarl-1.7.2-cp37-cp37m-win32.whl", hash = "sha256:695ba021a9e04418507fa930d5f0704edbce47076bdcfeeaba1c83683e5649d1"}, + {file = "yarl-1.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c17965ff3706beedafd458c452bf15bac693ecd146a60a06a214614dc097a271"}, + {file = "yarl-1.7.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fce78593346c014d0d986b7ebc80d782b7f5e19843ca798ed62f8e3ba8728576"}, + {file = "yarl-1.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c2a1ac41a6aa980db03d098a5531f13985edcb451bcd9d00670b03129922cd0d"}, + {file = "yarl-1.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:39d5493c5ecd75c8093fa7700a2fb5c94fe28c839c8e40144b7ab7ccba6938c8"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eb6480ef366d75b54c68164094a6a560c247370a68c02dddb11f20c4c6d3c9d"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ba63585a89c9885f18331a55d25fe81dc2d82b71311ff8bd378fc8004202ff6"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e39378894ee6ae9f555ae2de332d513a5763276a9265f8e7cbaeb1b1ee74623a"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c0910c6b6c31359d2f6184828888c983d54d09d581a4a23547a35f1d0b9484b1"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6feca8b6bfb9eef6ee057628e71e1734caf520a907b6ec0d62839e8293e945c0"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8300401dc88cad23f5b4e4c1226f44a5aa696436a4026e456fe0e5d2f7f486e6"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:788713c2896f426a4e166b11f4ec538b5736294ebf7d5f654ae445fd44270832"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fd547ec596d90c8676e369dd8a581a21227fe9b4ad37d0dc7feb4ccf544c2d59"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:737e401cd0c493f7e3dd4db72aca11cfe069531c9761b8ea474926936b3c57c8"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf81561f2972fb895e7844882898bda1eef4b07b5b385bcd308d2098f1a767b"}, + {file = "yarl-1.7.2-cp38-cp38-win32.whl", hash = "sha256:ede3b46cdb719c794427dcce9d8beb4abe8b9aa1e97526cc20de9bd6583ad1ef"}, + {file = "yarl-1.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:cc8b7a7254c0fc3187d43d6cb54b5032d2365efd1df0cd1749c0c4df5f0ad45f"}, + {file = "yarl-1.7.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:580c1f15500e137a8c37053e4cbf6058944d4c114701fa59944607505c2fe3a0"}, + {file = "yarl-1.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ec1d9a0d7780416e657f1e405ba35ec1ba453a4f1511eb8b9fbab81cb8b3ce1"}, + {file = "yarl-1.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3bf8cfe8856708ede6a73907bf0501f2dc4e104085e070a41f5d88e7faf237f3"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1be4bbb3d27a4e9aa5f3df2ab61e3701ce8fcbd3e9846dbce7c033a7e8136746"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:534b047277a9a19d858cde163aba93f3e1677d5acd92f7d10ace419d478540de"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6ddcd80d79c96eb19c354d9dca95291589c5954099836b7c8d29278a7ec0bda"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bfcd43c65fbb339dc7086b5315750efa42a34eefad0256ba114cd8ad3896f4b"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f64394bd7ceef1237cc604b5a89bf748c95982a84bcd3c4bbeb40f685c810794"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044daf3012e43d4b3538562da94a88fb12a6490652dbc29fb19adfa02cf72eac"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:368bcf400247318382cc150aaa632582d0780b28ee6053cd80268c7e72796dec"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:bab827163113177aee910adb1f48ff7af31ee0289f434f7e22d10baf624a6dfe"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0cba38120db72123db7c58322fa69e3c0efa933040ffb586c3a87c063ec7cae8"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:59218fef177296451b23214c91ea3aba7858b4ae3306dde120224cfe0f7a6ee8"}, + {file = "yarl-1.7.2-cp39-cp39-win32.whl", hash = "sha256:1edc172dcca3f11b38a9d5c7505c83c1913c0addc99cd28e993efeaafdfaa18d"}, + {file = "yarl-1.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:797c2c412b04403d2da075fb93c123df35239cd7b4cc4e0cd9e5839b73f52c58"}, + {file = "yarl-1.7.2.tar.gz", hash = "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd"}, ] zipp = [ {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, diff --git a/pyproject.toml b/pyproject.toml index 4d1b1cb..5cc114e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,8 +15,8 @@ python = "^3.9" click = "^8.1.2" # only necessary if 3.6 support is desired # dataclasses = "^0.8" -linkml-runtime = "^1.2.0rc6" -linkml = "^1.2.0rc7" +linkml-runtime = "^1.2.17" +linkml = "^1.2.11" mkdocs = "^1.2.3" pandas = "^1.3.5" python-dateutil = "^2.8.2" @@ -33,12 +33,13 @@ rdflib = "^6.0.2" PyYAML = "^5.3.1" pypandoc = "^1.7.5" twine = "^4.0.0" +oaklib = "^0.1.17" [tool.poetry.dev-dependencies] pytest = "^7.1.1" Sphinx = "^4.4.0" -sphinx-pdj-theme = "^0.2.0" +sphinx-pdj-theme = "^0.2.1" sphinx-click = "^3.1.0" sphinxcontrib-mermaid = "^0.7.1" @@ -48,6 +49,7 @@ requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" [tool.poetry.scripts] +schemauto = "schema_automator.cli:main" tsv2linkml = "schema_automator.importers.csv_import_engine:tsv2model" enum_annotator = "schema_automator.annotators.enum_annotator:enum_annotator" enums_to_curateable = "schema_automator.annotators.enums_to_curateable:enums_to_curateable" @@ -57,6 +59,7 @@ owl2linkml = "schema_automator.importers.owl_import_engine:owl2model" dosdp2linkml = "schema_automator.importers.owl_import_engine:dosdp2model" jsondata2linkml = "schema_automator.importers.json_instance_import_engine:json2model" jsonschema2linkml = "schema_automator.importers.jsonschema_import_engine:jsonschema2model" +extract-schema = "schema_automator.utils.schema_extractor:cli" [tool.poetry.extras] docs = ["Sphinx", "sphinx-pdj-theme", "sphinxcontrib-mermaid"] diff --git a/schema_automator/__init__.py b/schema_automator/__init__.py new file mode 100644 index 0000000..2eadd7a --- /dev/null +++ b/schema_automator/__init__.py @@ -0,0 +1,3 @@ +from schema_automator.annotators import * +from schema_automator.importers import * +from schema_automator.generalizers import * diff --git a/schema_automator/annotators/__init__.py b/schema_automator/annotators/__init__.py new file mode 100644 index 0000000..1bb4b07 --- /dev/null +++ b/schema_automator/annotators/__init__.py @@ -0,0 +1,2 @@ +from schema_automator.annotators.schema_annotator import SchemaAnnotator +from schema_automator.annotators.jsonld_annotator import JsonLdAnnotator \ No newline at end of file diff --git a/schema_automator/annotators/schema_annotator.py b/schema_automator/annotators/schema_annotator.py index 7020667..542cd4e 100644 --- a/schema_automator/annotators/schema_annotator.py +++ b/schema_automator/annotators/schema_annotator.py @@ -117,6 +117,7 @@ def annotate_schema(self, schema: Union[SchemaDefinition, str], match_only=True) elt.exact_mappings.append(xref) return sv.schema + @click.command() @click.argument('schema') @click.option('--output', '-o', help="Path to saved yaml schema") diff --git a/schema_automator/cli.py b/schema_automator/cli.py new file mode 100644 index 0000000..f8e2e8e --- /dev/null +++ b/schema_automator/cli.py @@ -0,0 +1,255 @@ +""" +Command Line Interface to Schema Automator +----------------------------- + +""" +import logging +import os +import click + +import yaml +from linkml_runtime.linkml_model import SchemaDefinition + +from schema_automator import JsonLdAnnotator +from schema_automator.annotators.schema_annotator import SchemaAnnotator +from schema_automator.generalizers.csv_data_generalizer import CsvDataGeneralizer +from schema_automator.importers.dosdp_import_engine import DOSDPImportEngine +from schema_automator.generalizers.json_instance_generalizer import JsonDataGeneralizer +from schema_automator.importers.jsonschema_import_engine import JsonSchemaImportEngine +from schema_automator.importers.owl_import_engine import OwlImportEngine +from schema_automator.generalizers.rdf_data_generalizer import RdfDataGeneralizer +from schema_automator.utils.schemautils import minify_schema, write_schema + +input_option = click.option( + "-i", + "--input", + help="path to input file" +) +output_option = click.option( + "-o", + "--output", + help="path to output file." +) +schema_name_option = click.option( + '--schema-name', + '-n', + default='example', + show_default=True, + help='Schema name') + + +@click.group() +@click.option("-v", "--verbose", + count=True, + help="Set the level of verbosity") +@click.option("-q", "--quiet", + help="Silence all diagnostics") +def main(verbose: int, quiet: bool): + """Run the LinkML Schema Automator Command Line. + + A subcommand must be passed, for example: + + schemauto -v SUBCOMMAND [OPTIONS] ARGUMENTS + """ + if verbose >= 2: + logging.basicConfig(level=logging.DEBUG) + elif verbose == 1: + logging.basicConfig(level=logging.INFO) + else: + logging.basicConfig(level=logging.WARNING) + if quiet: + logging.basicConfig(level=logging.ERROR) + + +@main.command() +@click.argument('tsvfile') # input TSV (must have column headers +@output_option +@schema_name_option +@click.option('--class-name', '-c', default='example', help='Core class name in schema') +@click.option('--column-separator', '-s', default='\t', help='separator') +@click.option('--downcase-header/--no-downcase-header', default=False, help='if true make headers lowercase') +@click.option('--enum-columns', '-E', multiple=True, help='column that is forced to be an enum') +@click.option('--robot/--no-robot', default=False, help='set if the TSV is a ROBOT template') +def generalize_tsv(tsvfile, output, class_name, schema_name, **kwargs): + """ + Generalizes from a single TSV file to a single-class schema + + See :ref:`generalizers` for more on the generalization framework + + Example: + + schemauto generalize-tsv --class-name Person --schema-name PersonInfo my/data/persons.tsv + """ + ie = CsvDataGeneralizer(**kwargs) + schema = ie.convert(tsvfile, class_name=class_name, schema_name=schema_name) + write_schema(schema, output) + + +@main.command() +@click.argument('tsvfiles', nargs=-1) # input TSV (must have column headers +@output_option +@schema_name_option +@click.option('--column-separator', '-s', default='\t', help='separator') +@click.option('--downcase-header/--no-downcase-header', default=False, help='if true make headers lowercase') +@click.option('--infer-foreign-keys/--no-infer-foreign-keys', default=False, help='infer ranges/foreign keys') +@click.option('--enum-columns', '-E', multiple=True, help='column(s) that is forced to be an enum') +@click.option('--enum-mask-columns', multiple=True, help='column(s) that are excluded from being enums') +@click.option('--max-enum-size', default=50, help='do not create an enum if more than max distinct members') +@click.option('--enum-threshold', default=0.1, help='if the number of distinct values / rows is less than this, do not make an enum') +@click.option('--robot/--no-robot', default=False, help='set if the TSV is a ROBOT template') +def generalize_tsvs(tsvfiles, output, schema_name, **kwargs): + """ + Generalizes from a multiple TSV files to a multi-class schema + + See :ref:`generalizers` for more on the generalization framework + + This uses :ref:`CsvDataGeneralizer.convert_multiple` + + Example: + + schemauto generalize-tsvs --class-name Person --schema-name PersonInfo my/data/*.tsv + """ + ie = CsvDataGeneralizer(**kwargs) + schema = ie.convert_multiple(tsvfiles, schema_name=schema_name) + write_schema(schema, output) + + +@main.command() +@click.argument('dpfiles', nargs=-1) ## input DOSDPs +@output_option +@schema_name_option +@click.option('--range-as-enum/--no-range-as-enums', + default=True, + help="Model range ontology classes as enums") +def import_dosdps(dpfiles, output, **args): + """ + Imports DOSDP pattern YAML to a LinkML schema + + See :ref:`importers` for more on the importers framework + """ + ie = DOSDPImportEngine() + schema = ie.convert(dpfiles, **args) + write_schema(schema, output) + + +@main.command() +@click.argument('input') +@output_option +@click.option('--container-class-name', help="name of root class") +@click.option('--format', '-f', default='json', help="json or yaml (or json.gz or yaml.gz) or frontmatter") +@click.option('--enum-columns', '-E', multiple=True, help='column(s) that is forced to be an enum') +@click.option('--enum-mask-columns', multiple=True, help='column(s) that are excluded from being enums') +@click.option('--max-enum-size', default=50, help='do not create an enum if more than max distinct members') +@click.option('--enum-threshold', default=0.1, help='if the number of distinct values / rows is less than this, do not make an enum') +@click.option('--omit-null/--no-omit-null', default=False, help="if true, ignore null values") +def generalize_json(input, output, format, omit_null, **kwargs): + """ + Generalizes from a JSON file to a schema + + See :ref:`generalizers` for more on the generalization framework + + Example: + + schemauto generalize-json my/data/persons.json + """ + ie = JsonDataGeneralizer(omit_null=omit_null) + schema = ie.convert(input, dir=dir, format=format, **kwargs) + write_schema(schema, output) + + +@main.command() +@click.argument('input') +@output_option +@schema_name_option +@click.option('--format', '-f', default='json', help='JSON Schema format - yaml or json') +def import_json_schema(input, output, schema_name, format, **args): + """ + Imports from JSON Schema to LinkML + + See :ref:`importers` for more on the importer framework + + Example: + + schemauto import-json-schema my/schema/personinfo.schema.json + """ + loader = JsonSchemaImportEngine() + schema = loader.load(input, name=schema_name, format=format) + write_schema(schema, output) + + +@main.command() +@click.argument('owlfile') +@output_option +@schema_name_option +@click.option('--identifier', '-I', help="Slot to use as identifier") +@click.option('--model-uri', help="Model URI prefix") +@click.option('--output', '-o', help="Path to saved yaml schema") +def import_owl(owlfile, output, **args): + """ + Import an OWL ontology to LinkML + + Note this works best for "schema-style" ontologies + + See :ref:`importers` for more on the importer framework + + Note: input must be in functional syntax + """ + sie = OwlImportEngine() + schema = sie.convert(owlfile, **args) + write_schema(schema, output) + + +@main.command() +@click.argument('rdffile') +@output_option +@click.option('--dir', '-d', required=True) +def generalize_rdf(rdffile, dir, output, **args): + """ + Generalizes from an RDF file to a schema + + See :ref:`generalizers` for more on the generalization framework + + The input must be in turtle + + Example: + + schemauto generalize-json my/data/persons.ttl + """ + sie = RdfDataGeneralizer() + if not os.path.exists(dir): + os.makedirs(dir) + schema_dict = sie.convert(rdffile, dir=dir, format='ttl') + write_schema(schema_dict, output) + + +@main.command() +@click.argument('schema') +@output_option +def annotate_schema(schema: str, output: str, **args): + """ + Annotate all elements of a schema + + Requires Bioportal API key + """ + logging.basicConfig(level=logging.INFO) + annr = SchemaAnnotator() + schema = annr.annotate_schema(schema) + write_schema(schema, output) + + +@main.command() +@click.argument('schema') +@output_option +def annotate_using_jsonld(schema: str, output: str, **args): + """ + Annotates a schema using a Json-LD context file + """ + logging.basicConfig(level=logging.INFO) + annr = JsonLdAnnotator() + schemadef = SchemaDefinition(schema) + annr.annotate_schema(schemadef) + write_schema(schemadef, output) + + +if __name__ == "__main__": + main() diff --git a/schema_automator/dosdp/__init__.py b/schema_automator/dosdp/__init__.py new file mode 100644 index 0000000..2f7be78 --- /dev/null +++ b/schema_automator/dosdp/__init__.py @@ -0,0 +1 @@ +from schema_automator.dosdp.model import * diff --git a/schema_automator/generalizers/__init__.py b/schema_automator/generalizers/__init__.py new file mode 100644 index 0000000..705c3fc --- /dev/null +++ b/schema_automator/generalizers/__init__.py @@ -0,0 +1,3 @@ +from schema_automator.generalizers.csv_data_generalizer import CsvDataGeneralizer +from schema_automator.generalizers.json_instance_generalizer import JsonDataGeneralizer +from schema_automator.generalizers.rdf_data_generalizer import RdfDataGeneralizer \ No newline at end of file diff --git a/schema_automator/importers/csv_import_engine.py b/schema_automator/generalizers/csv_data_generalizer.py similarity index 86% rename from schema_automator/importers/csv_import_engine.py rename to schema_automator/generalizers/csv_data_generalizer.py index 20bf992..ae07471 100644 --- a/schema_automator/importers/csv_import_engine.py +++ b/schema_automator/generalizers/csv_data_generalizer.py @@ -11,10 +11,14 @@ import time from dateutil.parser import parse +from linkml_runtime import SchemaView +from linkml_runtime.linkml_model import SchemaDefinition, ClassDefinition, TypeDefinition, SlotDefinition from quantulum3 import parser as q_parser from dataclasses import dataclass, field + +from schema_automator.generalizers.generalizer import Generalizer from schema_automator.importers.import_engine import ImportEngine -from schema_automator.utils.schemautils import merge_schemas +from schema_automator.utils.schemautils import merge_schemas, write_schema ID_SUFFIX = '_id' @@ -50,9 +54,12 @@ def score(self): @dataclass -class CsvDataImportEngine(ImportEngine): +class CsvDataGeneralizer(Generalizer): + """ + A Generalizer that generalizes from example CSV/TSV data + """ - file_separator: str = "\t" + column_separator: str = "\t" schema_name: str = 'example' robot: bool = False enum_columns: List[str] = field(default_factory=lambda: []) @@ -88,7 +95,7 @@ def infer_linkages(self, files: List[str], **kwargs) -> List[ForeignKey]: if self.downcase_header: c = c.lower() print(f'READING {file} ') - df = pd.read_csv(file, sep=self.file_separator, skipinitialspace=True).fillna("") + df = pd.read_csv(file, sep=self.column_separator, skipinitialspace=True).fillna("") if self.downcase_header: df = df.rename(columns=str.lower) exclude = [] @@ -162,48 +169,54 @@ def infer_linkages(self, files: List[str], **kwargs) -> List[ForeignKey]: logging.info(f'FILTERED: {fks}') return fks - def inject_foreign_keys(self, schema_dict: Dict, fks: List[ForeignKey]) -> None: + def inject_foreign_keys(self, sv: SchemaView, fks: List[ForeignKey]) -> None: + schema = sv.schema for fk in fks: # TODO: deal with cases where the same slot is used in different classes - src_cls = schema_dict['classes'][fk.source_table] - src_slot = schema_dict['slots'][fk.source_column] - if 'slot_usage' not in src_cls: - src_cls['slot_usage'] = {} - src_cls['slot_usage'][fk.source_column] = {'range': fk.target_table} + src_cls = schema.classes[fk.source_table] + src_slot = schema.slots[fk.source_column] + src_cls.slot_usage[fk.source_column] = \ + SlotDefinition(name=fk.source_column, + range=fk.target_table) #src_slot['range'] = fk.target_table - tgt_cls = schema_dict['classes'][fk.target_table] - tgt_slot = schema_dict['slots'][fk.target_column] - if 'slot_usage' not in tgt_cls: - tgt_cls['slot_usage'] = {} - tgt_cls['slot_usage'][fk.target_column] = {'identifier': True} + tgt_cls = schema.classes[fk.target_table] + tgt_slot = schema.slots[fk.target_column] + tgt_cls.slot_usage[fk.target_column] = \ + SlotDefinition(name=fk.target_column, + identifier=True) #tgt_slot['identifier'] = True - def convert_multiple(self, files: List[str], **kwargs) -> Dict: + def convert_multiple(self, files: List[str], **kwargs) -> SchemaDefinition: if self.infer_foreign_keys: fks = self.infer_linkages(files) else: fks = () - yamlobjs = [] + schemas = [] for file in files: c = os.path.splitext(os.path.basename(file))[0] if self.downcase_header: c = c.lower() s = self.convert(file, class_name=c, **kwargs) if s is not None: - yamlobjs.append(s) - s = merge_schemas(yamlobjs) - self.inject_foreign_keys(s, fks) - return s - - def convert(self, file: str, **kwargs) -> Dict: + schemas.append(s) + print(f'CLASSES={list(s.classes.keys())}') + sv = SchemaView(schemas[0]) + for s in schemas[1:]: + sv.merge_schema(s) + print(f'xxxCLASSES={list(sv.all_classes().keys())}') + #s = merge_schemas(yamlobjs) + self.inject_foreign_keys(sv, fks) + return sv.schema + + def convert(self, file: str, **kwargs) -> SchemaDefinition: with open(file, newline='') as tsv_file: header = [h.strip() for h in tsv_file.readline().split('\t')] - rr = csv.DictReader(tsv_file, fieldnames=header, delimiter=self.file_separator, skipinitialspace=False) + rr = csv.DictReader(tsv_file, fieldnames=header, delimiter=self.column_separator, skipinitialspace=False) return self.convert_dicts([r for r in rr], **kwargs) def read_slot_tsv(self, file: str, **kwargs) -> Dict: with open(file, newline='') as tsv_file: - rows_list = csv.reader(tsv_file, delimiter=self.file_separator) + rows_list = csv.reader(tsv_file, delimiter=self.column_separator) return self.convert_to_edge_slots([r for r in rows_list], **kwargs) def convert_to_edge_slots(self, @@ -259,9 +272,9 @@ def convert_to_edge_slots(self, def convert_dicts(self, rr: List[Dict], - name: str = 'example', + schema_name: str = 'example', class_name: str = 'example', - **kwargs) -> Optional[Dict]: + **kwargs) -> SchemaDefinition: slots = {} slot_values = {} n = 0 @@ -380,28 +393,25 @@ def convert_dicts(self, for sn, s in new_slots.items(): if sn not in slots: slots[sn] = s - schema = { - 'id': f'https://w3id.org/{name}', - 'name': name, - 'description': name, - 'imports': ['linkml:types'], - 'prefixes': { - 'linkml': 'https://w3id.org/linkml/', - name: f'https://w3id.org/{name}' - }, - 'default_prefix': name, - 'types': types, - 'classes': { - class_name: { - 'slots': class_slots, - 'slot_usage': slot_usage - } - }, - 'slots': slots, - 'enums': enums - } + schema = SchemaDefinition( + id=f'https://w3id.org/{schema_name}', + name=schema_name, + description=schema_name, + imports=['linkml:types'], + default_prefix=schema_name, + types=types, + classes=[ + ClassDefinition(class_name, + slots=class_slots, + slot_usage=slot_usage) + ], + slots=slots, + enums=enums + ) + self.add_default_prefixes(schema) + self.add_prefix(schema, schema_name, f'https://w3id.org/{schema_name}') if robot_defs: - schema['prefixes']['IAO'] = 'http://purl.obolibrary.org/obo/IAO_' + self.add_prefix(schema, 'IAO', 'http://purl.obolibrary.org/obo/IAO_') add_missing_to_schema(schema) return schema @@ -452,7 +462,12 @@ def is_all_measurement(values): n_dimensional = 0 n = 0 for value in values: - ms = q_parser.parse(value) + if not isinstance(value, str): + return False + try: + ms = q_parser.parse(value) + except: + return False if len(ms) == 0: return False n += 1 @@ -614,7 +629,7 @@ def infer_enum_meanings(schema: dict, pv['description'] = hit.name -def add_missing_to_schema(schema: dict): +def add_missing_to_schema_dict(schema: dict): for slot in schema['slots'].values(): if slot.get('range', None) == 'measurement': types = schema['types'] @@ -624,6 +639,17 @@ def add_missing_to_schema(schema: dict): 'description': 'Holds a measurement serialized as a string'} +def add_missing_to_schema(schema: SchemaDefinition): + for slot in schema.slots.values(): + if slot.range == 'measurement': + types = schema.types + if 'measurement' not in types: + types['measurement'] = \ + TypeDefinition('measurement', + typeof='string', + description='Holds a measurement serialized as a string') + + @click.group() def main(): pass @@ -634,20 +660,16 @@ def main(): @click.option('--output', '-o', help='Output file') @click.option('--class_name', '-c', default='example', help='Core class name in schema') @click.option('--schema_name', '-n', default='example', help='Schema name') -@click.option('--sep', '-s', default='\t', help='separator') +@click.option('--separator', '-s', default='\t', help='separator') @click.option('--downcase-header/--no-downcase-header', default=False, help='if true make headers lowercase') @click.option('--enum-columns', '-E', multiple=True, help='column that is forced to be an enum') @click.option('--robot/--no-robot', default=False, help='set if the TSV is a ROBOT template') -def tsv2model(tsvfile, output, class_name, schema_name, **kwargs): +def tsv2model(tsvfile, output, separator, class_name, schema_name, **kwargs): """ Infer a model from a TSV """ - ie = CsvDataImportEngine(**kwargs) - schema_dict = ie.convert(tsvfile, class_name=class_name, schema_name=schema_name) - ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) - if output: - with open(output, 'w') as stream: - stream.write(ys) - else: - print(ys) + ie = CsvDataGeneralizer(**kwargs) + schema = ie.convert(tsvfile, class_name=class_name, schema_name=schema_name) + write_schema(schema, output) + @main.command() @click.argument('tsvfiles', nargs=-1) # input TSV (must have column headers @@ -663,14 +685,9 @@ def tsv2model(tsvfile, output, class_name, schema_name, **kwargs): @click.option('--robot/--no-robot', default=False, help='set if the TSV is a ROBOT template') def tsvs2model(tsvfiles, output, schema_name, **kwargs): """ Infer a model from multiple TSVs """ - ie = CsvDataImportEngine(**kwargs) - schema_dict = ie.convert_multiple(tsvfiles, schema_name=schema_name) - ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) - if output: - with open(output, 'w') as stream: - stream.write(ys) - else: - print(ys) + ie = CsvDataGeneralizer(**kwargs) + schema = ie.convert_multiple(tsvfiles, schema_name=schema_name) + write_schema(schema, output) @main.command() @@ -684,7 +701,6 @@ def enrich(yamlfile, results, **args): infer_enum_meanings(yamlobj, cache=cache) if results is not None: with open(results, "w") as io: - #io.write(str(cache)) io.write(yaml.dump(cache)) print(yaml.dump(yamlobj, default_flow_style=False, sort_keys=False)) diff --git a/schema_automator/generalizers/generalizer.py b/schema_automator/generalizers/generalizer.py new file mode 100644 index 0000000..e7d5f31 --- /dev/null +++ b/schema_automator/generalizers/generalizer.py @@ -0,0 +1,20 @@ +from abc import ABC + +from linkml_runtime.linkml_model import SchemaDefinition, Prefix + + +class Generalizer(ABC): + """ + Abstract Base Class for all Generalization Engines. + + Generalization Engines take example data in some format and generalizes to a new SchemaDefinition + """ + + def convert(self, file: str, **kwargs) -> SchemaDefinition: + raise NotImplementedError + + def add_prefix(self, schema: SchemaDefinition, prefix: str, url: str): + schema.prefixes[prefix] = Prefix(prefix, url) + + def add_default_prefixes(self, schema: SchemaDefinition): + self.add_prefix(schema, 'linkml', 'https://w3id.org/linkml/') \ No newline at end of file diff --git a/schema_automator/importers/json_instance_import_engine.py b/schema_automator/generalizers/json_instance_generalizer.py similarity index 79% rename from schema_automator/importers/json_instance_import_engine.py rename to schema_automator/generalizers/json_instance_generalizer.py index d3fb5ae..e22abff 100644 --- a/schema_automator/importers/json_instance_import_engine.py +++ b/schema_automator/generalizers/json_instance_generalizer.py @@ -1,28 +1,31 @@ import click -import logging -from typing import Union, Dict, Tuple, List, Any +from typing import Union, Dict, List, Any from collections import defaultdict -import os -from csv import DictWriter import json import yaml import gzip from dataclasses import dataclass -from schema_automator.importers.import_engine import ImportEngine -from schema_automator.importers.csv_import_engine import CsvDataImportEngine -from schema_automator.utils.schemautils import merge_schemas + +from linkml_runtime import SchemaView +from linkml_runtime.linkml_model import SchemaDefinition + +from schema_automator.generalizers.generalizer import Generalizer +from schema_automator.generalizers.csv_data_generalizer import CsvDataGeneralizer from linkml_runtime.utils.formatutils import camelcase +from schema_automator.utils.schemautils import write_schema + + @dataclass -class JsonInstanceImportEngine(ImportEngine): +class JsonDataGeneralizer(Generalizer): mappings: dict = None omit_null: bool = None def convert(self, input: Union[str, Dict], format: str = 'json', container_class_name='Container', - **kwargs): - csv_engine = CsvDataImportEngine(**kwargs) + **kwargs) -> SchemaDefinition: + csv_engine = CsvDataGeneralizer(**kwargs) if isinstance(input, dict): obj = input @@ -43,13 +46,16 @@ def convert(self, input: Union[str, Dict], format: str = 'json', rows_by_table = defaultdict(list) self.rows_by_table = rows_by_table self._convert_obj(obj, table=container_class_name) - yamlobjs = [] + schemas = [] for cn, rows_dict in rows_by_table.items(): - schema_obj = csv_engine.convert_dicts(rows_dict, cn, cn) - yamlobjs.append(schema_obj) - yamlobj = merge_schemas(yamlobjs) - yamlobj['classes'][container_class_name]['tree_root'] = True - return yamlobj + schema = csv_engine.convert_dicts(rows_dict, cn, cn) + schemas.append(schema) + sv = SchemaView(schemas[0]) + for s in schemas[1:]: + sv.merge_schema(s) + schema = sv.schema + schema.classes[container_class_name].tree_root = True + return schema def _key_to_classname(self, k: str) -> str: return camelcase(k) @@ -117,10 +123,9 @@ def json2model(input, format, omit_null, **kwargs): """ - ie = JsonInstanceImportEngine(omit_null=omit_null) - schema_dict = ie.convert(input, dir=dir, format=format, **kwargs) - ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) - print(ys) + ie = JsonDataGeneralizer(omit_null=omit_null) + schema = ie.convert(input, dir=dir, format=format, **kwargs) + write_schema(schema) @click.command() @click.argument('inputs', nargs=-1) @@ -136,11 +141,10 @@ def frontmatter2model(inputs, format, omit_null, **kwargs): """ print(f'INPUTS={inputs}') - ie = JsonInstanceImportEngine(omit_null=omit_null) + ie = JsonDataGeneralizer(omit_null=omit_null) objs = parse_frontmatter_files(list(inputs)) - schema_dict = ie.convert({'objects': objs}, dir=dir, format=format, **kwargs) - ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) - print(ys) + schema = ie.convert({'objects': objs}, dir=dir, format=format, **kwargs) + write_schema(schema) if __name__ == '__main__': json2model() diff --git a/schema_automator/importers/rdf_instance_import_engine.py b/schema_automator/generalizers/rdf_data_generalizer.py similarity index 63% rename from schema_automator/importers/rdf_instance_import_engine.py rename to schema_automator/generalizers/rdf_data_generalizer.py index 3250e45..ce9dc95 100644 --- a/schema_automator/importers/rdf_instance_import_engine.py +++ b/schema_automator/generalizers/rdf_data_generalizer.py @@ -1,49 +1,50 @@ import click -import logging -from typing import Union, Dict, Tuple, List from collections import defaultdict import os from csv import DictWriter -import yaml +from linkml_runtime import SchemaView +from linkml_runtime.linkml_model import SchemaDefinition from rdflib import Graph, URIRef -from rdflib.query import ResultRow -from rdflib.namespace import RDF, RDFS -from SPARQLWrapper import SPARQLWrapper, N3, SPARQLWrapper2, RDFXML, TURTLE +from rdflib.namespace import RDF from dataclasses import dataclass -from schema_automator.importers.import_engine import ImportEngine -from schema_automator.importers.csv_import_engine import CsvDataImportEngine -from schema_automator.utils.schemautils import merge_schemas + +from schema_automator.generalizers.generalizer import Generalizer +from schema_automator.generalizers.csv_data_generalizer import CsvDataGeneralizer +from schema_automator.utils.schemautils import write_schema + @dataclass -class RdfInstanceImportEngine(ImportEngine): +class RdfDataGeneralizer(Generalizer): mappings: dict = None - def convert(self, file: str, dir: str, **kwargs): - csv_engine = CsvDataImportEngine() + def convert(self, file: str, dir: str, **kwargs) -> SchemaDefinition: + csv_engine = CsvDataGeneralizer() g = Graph() g.parse(file, **kwargs) self.mappings = {} paths = self.graph_to_tables(g, dir) - yamlobjs = [] + schemas = [] for c, tsvfile in paths.items(): - yamlobjs.append(csv_engine.convert(tsvfile, class_name=c)) - yamlobj = merge_schemas(yamlobjs) + schemas.append(csv_engine.convert(tsvfile, class_name=c)) + sv = SchemaView(schemas[0]) + for s in schemas[1:]: + sv.merge_schema(s) + schema = sv.schema mappings = self.mappings - for cn, c in yamlobj['classes'].items(): + for cn, c in schema.classes.items(): if cn in mappings: - c['class_uri'] = mappings[cn] - for sn, s in yamlobj['slots'].items(): + c.class_uri = mappings[cn] + for sn, s in schema.slots.items(): if sn in mappings: - s['slot_uri'] = mappings[sn] - for en, e in yamlobj['enums'].items(): - if 'permissible_values' in e: - for pvn, pvo in e['permissible_values'].items(): - if pvn in mappings: - pvo['meaning'] = mappings[pvn] - return yamlobj + s.slot_uri = mappings[sn] + for en, e in schema.enums.items(): + for pvn, pvo in e.permissible_values.items(): + if pvn in mappings: + pvo.meaning = mappings[pvn] + return schema def graph_to_tables(self, g: Graph, dir: str): mappings = self.mappings @@ -95,12 +96,11 @@ def _as_name(self, v): @click.option('--dir', '-d', required=True) def rdf2model(rdffile, dir, **args): """ Infer a model from RDF instance data """ - sie = RdfInstanceImportEngine() + sie = RdfDataGeneralizer() if not os.path.exists(dir): os.makedirs(dir) - schema_dict = sie.convert(rdffile, dir=dir, format='ttl') - ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) - print(ys) + schema = sie.convert(rdffile, dir=dir, format='ttl') + write_schema(schema) if __name__ == '__main__': rdf2model() diff --git a/schema_automator/importers/__init__.py b/schema_automator/importers/__init__.py new file mode 100644 index 0000000..533305c --- /dev/null +++ b/schema_automator/importers/__init__.py @@ -0,0 +1,4 @@ +from schema_automator.importers.jsonschema_import_engine import JsonSchemaImportEngine +from schema_automator.importers.owl_import_engine import OwlImportEngine +from schema_automator.importers.dosdp_import_engine import DOSDPImportEngine + diff --git a/schema_automator/importers/dosdp_import_engine.py b/schema_automator/importers/dosdp_import_engine.py index 86c556b..4a9273a 100644 --- a/schema_automator/importers/dosdp_import_engine.py +++ b/schema_automator/importers/dosdp_import_engine.py @@ -16,6 +16,7 @@ from schema_automator.importers.import_engine import ImportEngine from schema_automator.dosdp.model import Pattern, Printf +from schema_automator.utils.schemautils import write_schema ALIAS = str CURIE = str @@ -199,8 +200,6 @@ def _deref(self, name: ALIAS, index: dict) -> CURIE: return index[name].curie - - @click.command() @click.argument('dpfiles', nargs=-1) ## input DOSDPs @click.option('--name', '-n', help="Schema name") @@ -213,12 +212,7 @@ def dosdp2model(dpfiles, output, **args): """ ie = DOSDPImportEngine() schema = ie.convert(dpfiles, **args) - ys = yaml.dump(schema, default_flow_style=False, sort_keys=False) - if output: - with open(output, 'w') as stream: - stream.write(ys) - else: - print(ys) + write_schema(schema, output) if __name__ == '__main__': dosdp2model() diff --git a/schema_automator/importers/import_engine.py b/schema_automator/importers/import_engine.py index 4e22260..b807899 100644 --- a/schema_automator/importers/import_engine.py +++ b/schema_automator/importers/import_engine.py @@ -1,2 +1,20 @@ -class ImportEngine: - None \ No newline at end of file +from abc import ABC + +from linkml_runtime.linkml_model import SchemaDefinition, Prefix + + +class ImportEngine(ABC): + """ + Abstract Base Class for all Import Engines. + + Import Engines take some kind of input and import into a new SchemaDefinition + """ + + def convert(self, file: str, **kwargs) -> SchemaDefinition: + raise NotImplementedError + + def add_prefix(self, schema: SchemaDefinition, prefix: str, url: str): + schema.prefixes[prefix] = Prefix(prefix, url) + + def add_default_prefixes(self, schema: SchemaDefinition): + self.add_prefix(schema, 'linkml', 'https://w3id.org/linkml/') \ No newline at end of file diff --git a/schema_automator/importers/infer_model_from_rdftab.py b/schema_automator/importers/infer_model_from_rdftab.py index f0c743a..2429b16 100644 --- a/schema_automator/importers/infer_model_from_rdftab.py +++ b/schema_automator/importers/infer_model_from_rdftab.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -"""Infer a schema from a TSV +"""Infer a schema from a rdftab """ from linkml.utils.schemaloader import load_raw_schema diff --git a/schema_automator/importers/jsonschema_import_engine.py b/schema_automator/importers/jsonschema_import_engine.py index 8923302..abcbf43 100644 --- a/schema_automator/importers/jsonschema_import_engine.py +++ b/schema_automator/importers/jsonschema_import_engine.py @@ -13,12 +13,15 @@ from linkml_runtime.utils.formatutils import underscore from schema_automator.importers.import_engine import ImportEngine -from schema_automator.utils.schemautils import minify_schema +from schema_automator.utils.schemautils import minify_schema, write_schema # TODO: move to core. https://github.com/linkml/linkml/issues/104 RESERVED = ['in', 'not', 'def'] class JsonSchemaImportEngine(ImportEngine): + """ + A :ref:`ImportEngine` that imports a JSON-Schema representation to a LinkML Schema + """ def load(self, input: str, name=None, format = 'json', **kwargs): if format == 'json': @@ -226,9 +229,6 @@ def translate_properties(self, obj: dict, parent_class: ClassDefinition): parent_class.slot_usage[slot.name] = slot - - - @click.command() @click.argument('input') @click.option('--name', '-n', required=True, help='ID of schema') @@ -238,12 +238,7 @@ def jsonschema2model(input, output, name, format, **args): """ Infer a model from JSON Schema """ loader = JsonSchemaImportEngine() schema = loader.load(input, name=name, format=format) - sd = minify_schema(schema) - if output: - with open(output, 'w') as stream: - yaml.safe_dump(sd, stream, sort_keys=False) - else: - print(yaml.safe_dump(sd, sort_keys=False)) + write_schema(schema, output) if __name__ == '__main__': diff --git a/schema_automator/importers/owl_import_engine.py b/schema_automator/importers/owl_import_engine.py index 85b72b6..487a9bd 100644 --- a/schema_automator/importers/owl_import_engine.py +++ b/schema_automator/importers/owl_import_engine.py @@ -3,28 +3,36 @@ import yaml from typing import Union, Dict, Tuple, List, Any from collections import defaultdict -import os -from csv import DictWriter -from rdflib import Graph, URIRef -from rdflib.query import ResultRow -from rdflib.namespace import RDF, RDFS -from SPARQLWrapper import SPARQLWrapper, N3, SPARQLWrapper2, RDFXML, TURTLE +from linkml_runtime.linkml_model import SchemaDefinition from funowl.converters.functional_converter import to_python from funowl import * -import funowl - from dataclasses import dataclass from schema_automator.importers.import_engine import ImportEngine +from schema_automator.utils.schemautils import write_schema @dataclass class OwlImportEngine(ImportEngine): + """ + An ImportEngine that takes schema-style OWL and converts it to a LinkML schema + """ mappings: dict = None include_unmapped_annotations = False - def convert(self, file: str, name: str = None, model_uri: str = None, identifier: str = None, **kwargs): + def convert(self, file: str, name: str = None, model_uri: str = None, identifier: str = None, **kwargs) -> \ + SchemaDefinition: + """ + Converts an OWL schema-style ontology + + :param file: + :param name: + :param model_uri: + :param identifier: + :param kwargs: + :return: + """ self.mappings = {} doc = to_python(file) ontology = doc.ontology @@ -40,7 +48,7 @@ def convert(self, file: str, name: str = None, model_uri: str = None, identifier slots = {} enums = {} types = {} - schema = { + schema_dict = { 'id': f'{ontology.iri}', 'name': name, 'description': name, @@ -55,7 +63,7 @@ def convert(self, file: str, name: str = None, model_uri: str = None, identifier 'slots': slots, 'enums': enums } - self.schema = schema + self.schema = schema_dict isamap = defaultdict(set) slot_isamap = defaultdict(set) slot_usage_map = defaultdict(dict) @@ -291,8 +299,8 @@ def set_cardinality(p, min_card, max_card): if self.include_unmapped_annotations: self.element_info(t, sub, 'comments', f'{p} = {val}', multivalued=True) for cn, usage in slot_usage_map.items(): - schema['classes'][cn]['slot_usage'] = usage - for sn, s in schema['slots'].items(): + schema_dict['classes'][cn]['slot_usage'] = usage + for sn, s in schema_dict['slots'].items(): if 'multivalued' not in s: s['multivalued'] = sn not in single_valued_slots if 'range' in s: @@ -314,6 +322,7 @@ def set_cardinality(p, min_card, max_card): if 'slots' not in c: c['slots'] = [] c['slots'].append(identifier) + schema = SchemaDefinition(**schema_dict) return schema def class_info(self, *args, **kwargs): @@ -357,7 +366,6 @@ def _as_name(self, v): return v - @click.command() @click.argument('owlfile') @click.option('--name', '-n', help="Schema name") @@ -371,13 +379,9 @@ def owl2model(owlfile, output, **args): Note: input must be in functional syntax """ sie = OwlImportEngine() - schema_dict = sie.convert(owlfile, **args) - ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) - if output: - with open(output, 'w') as stream: - stream.write(ys) - else: - print(ys) + schema = sie.convert(owlfile, **args) + write_schema(schema, output) + if __name__ == '__main__': owl2model() diff --git a/schema_automator/jsonschema/__init__.py b/schema_automator/jsonschema/__init__.py new file mode 100644 index 0000000..efb4932 --- /dev/null +++ b/schema_automator/jsonschema/__init__.py @@ -0,0 +1 @@ +from schema_automator.jsonschema.jsonschema import * diff --git a/schema_automator/utils/__init__.py b/schema_automator/utils/__init__.py new file mode 100644 index 0000000..6de5fc9 --- /dev/null +++ b/schema_automator/utils/__init__.py @@ -0,0 +1 @@ +from schema_automator.utils.schemautils import write_schema \ No newline at end of file diff --git a/schema_automator/utils/instance_extractor.py b/schema_automator/utils/instance_extractor.py new file mode 100644 index 0000000..58c3bd3 --- /dev/null +++ b/schema_automator/utils/instance_extractor.py @@ -0,0 +1,207 @@ +import logging +from copy import copy +from dataclasses import dataclass, field +from typing import List, Dict, Any, Tuple, Union, Optional + +import click +from linkml.generators.pythongen import PythonGenerator +from linkml.utils import datautils +from linkml_runtime import SchemaView +from linkml_runtime.linkml_model import ClassDefinitionName, SlotDefinitionName +from linkml_runtime.utils.yamlutils import YAMLRoot + +ID_REF = str +PATH = List[str] + + +@dataclass +class InstanceView: + """ + A wrapper over an instance and it's sub-instances (instance tree) + """ + root: YAMLRoot = None + schemaview: SchemaView = None + id_to_path: Dict[ID_REF, PATH] = field(default_factory=lambda: {}) + id_to_obj: Dict[ID_REF, YAMLRoot] = field(default_factory=lambda: {}) + references: List[Tuple[ID_REF, ID_REF]] = field(default_factory=lambda: []) + + def create_index(self, obj: Union[YAMLRoot, Dict, List] = None, + path=None, parent=None): + """ + Creates internal index + + :param obj: + :param path: + :param parent: + :return: + """ + logging.debug(f'Creating index...') + if path is None: + path = [] + if obj is None: + obj = self.root + sv = self.schemaview + indent = len(path) * ' ' + #print(f'{indent}{type(obj)} // {path}') + if isinstance(obj, dict): + for k, v in obj.items(): + self.create_index(v, path=path + [k], parent=parent) + elif isinstance(obj, list): + for i in range(0, len(obj)-1): + self.create_index(obj[i], path=path + [i], parent=parent) + elif isinstance(obj, YAMLRoot): + cn = type(obj).class_name + for slot in sv.class_induced_slots(cn): + v = getattr(obj, slot.alias, None) + if v is not None: + if slot.identifier: + self.references.append((parent, v)) + # TODO: use explicit scheme to prioritize + if v not in self.id_to_path: + self.id_to_path[v] = path + self.id_to_obj[v] = obj + else: + curr_path = self.id_to_path[v] + if len(path) < len(curr_path): + self.id_to_path[v] = path + self.id_to_obj[v] = obj + else: + if slot.range in sv.all_classes(): + if isinstance(v, str): + self.references.append((parent, v)) + self.create_index(v, path=path+[slot.alias], parent=obj) + logging.debug(f'Created index') + + def fetch_object(self, id_ref: ID_REF, default_val = None) -> Optional[YAMLRoot]: + """ + Fetches an object by ID + + :param id_ref: + :param default_val: + :return: default_val if ID is dangling, otherwise return object with that ID + """ + return self.id_to_obj.get(id_ref, default_val) + + + def extract(self, seeds: List[ID_REF], preserve_slots: List[SlotDefinitionName] = None) -> YAMLRoot: + """ + Extracts a subtree using a seed set of identifiers + + The subtree will include ancestors and descendants of identifiers, plus all recursive + subtrees of all referenced entities + + :param seeds: + :param preserve_slots: + :return: + """ + logging.info(f'Extracting from seed: {seeds}') + id_to_path = self.id_to_path + xdict = {} + to_visit = copy(seeds) + visited = set() + while len(to_visit) > 0: + nxt = to_visit.pop() + if nxt in visited: + continue + logging.info(f'Extracting: {nxt}; {len(to_visit)} to go') + if nxt not in id_to_path: + logging.warning(f'No element with ID {nxt}') + continue + obj = self.fetch_object(nxt) + path = self.id_to_path[nxt][0:-1] + if len(path) != 1: + continue + #raise ValueError(f'{path} for {nxt}') + #print(f'{nxt} = {rg} // {type(obj)}') + islot = path[0] + if islot not in xdict: + if isinstance(getattr(self.root, islot), dict): + xdict[islot] = {} + else: + xdict[islot] = [] + if isinstance(xdict[islot], dict): + xdict[islot][nxt] = obj + else: + xdict[islot].append(obj) + refs = self.get_object_references(obj) + for ref in refs: + if ref not in visited: + to_visit.append(ref) + visited.add(nxt) + if preserve_slots is None: + preserve_slots = [] + root_cls = type(self.root) + for slot in self.schemaview.class_induced_slots(root_cls.class_name): + if slot.required: + preserve_slots.append(slot.alias) + for slot in preserve_slots: + xdict[slot] = getattr(self.root, slot) + #print(f'VISITED={visited}') + #print(yaml_dumper.dumps(xdict)) + return root_cls(**xdict) + + + def get_object_references(self, start_obj: Optional[Union[YAMLRoot, Dict, List]], + depth: int = 0) -> List[ID_REF]: + logging.info(f'Fetching object references from {type(start_obj)}') + if object is None: + return [] + sv = self.schemaview + refs = [] + indent = ' ' * depth + #print(f'{indent}IN {type(obj)}') + seeds = [start_obj] + visited = set() + while len(seeds) > 0: + obj = seeds.pop() + if isinstance(obj, YAMLRoot): + for slot in sv.class_induced_slots(type(obj).class_name): + v = getattr(obj, slot.alias, None) + if v is not None: + if slot.identifier: + refs.append(v) + else: + rg = slot.range + if rg in sv.all_classes(): + #print(f'{indent} - OBJ {type(obj)} {slot.alias} = {v} // {rg} // cumul={refs}') + if isinstance(v, list): + seeds += v + elif isinstance(v, dict): + seeds += v.values() + else: + seeds.append(v) + else: + if obj not in visited: + refs.append(obj) + if obj in self.id_to_obj: + seeds.append(self.id_to_obj[obj]) + visited.add(obj) + #print(f'{indent}OUT {type(obj)} {cn} = {refs}') + return list(set(refs)) + + + +@click.command() +@click.argument('elements', nargs=-1) +@click.option('--schema', '-s', help="Schema file") +@click.option('--input', '-i', help="Data input") +@click.option('--output', '-o', help="Path to saved yaml schema") +def cli(elements, input, schema, output, **args): + """ + Extract from instance data + """ + sv = SchemaView(schema) + fmt = datautils._get_format(input) + loader = datautils.get_loader(fmt) + python_module = PythonGenerator(schema).compile_module() + target_class = datautils.infer_root_class(sv) + py_target_class = python_module.__dict__[target_class] + root = loader.load(source=input, target_class=py_target_class,) + iv = InstanceView(root=root, schemaview=sv) + iv.extract(elements) + +if __name__ == '__main__': + cli() + + + diff --git a/schema_automator/utils/schema_extractor.py b/schema_automator/utils/schema_extractor.py new file mode 100644 index 0000000..c13833e --- /dev/null +++ b/schema_automator/utils/schema_extractor.py @@ -0,0 +1,57 @@ +import logging + +import click +import yaml +from linkml_runtime import SchemaView +from linkml_runtime.dumpers import yaml_dumper +from linkml_runtime.linkml_model import SlotDefinitionName +from linkml_runtime.utils.introspection import package_schemaview +from linkml_runtime.utils.schema_as_dict import schema_as_dict, schema_as_yaml_dump + +from schema_automator.utils.instance_extractor import InstanceView +from schema_automator.utils.schemautils import minify_schema + + +@click.command() +@click.argument('elements', nargs=-1) +@click.option('--mergeimports/--no-mergeimports', help="Merge imports closure") +@click.option('--input', '-i', help="Data input") +@click.option('--output', '-o', help="Path to saved yaml schema") +@click.option("-v", "--verbose", count=True) +def cli(elements, input, mergeimports, output, verbose: int, **args): + """ + Extract from instance data + """ + if verbose >= 2: + logging.basicConfig(level=logging.DEBUG) + elif verbose == 1: + logging.basicConfig(level=logging.INFO) + else: + logging.basicConfig(level=logging.WARNING) + metamodel_sv = package_schemaview('linkml_runtime.linkml_model.meta') + input_sv = SchemaView(input) + #schema = yaml_loader.load(source=input, target_class=SchemaDefinition) + #print(yaml_dumper.dumps(root)) + if mergeimports: + input_sv.merge_imports() + input_schema = input_sv.schema + iv = InstanceView(root=input_schema, schemaview=metamodel_sv) + logging.info(f'Creating index') + iv.create_index() + subschema = iv.extract(list(elements), + preserve_slots=[SlotDefinitionName('name'), + SlotDefinitionName('prefixes'), + ]) + ys = schema_as_yaml_dump(subschema) + if output: + with open(output, 'w') as stream: + stream.write(ys) + else: + print(ys) + + +if __name__ == '__main__': + cli() + + + diff --git a/schema_automator/utils/schemautils.py b/schema_automator/utils/schemautils.py index 029f751..e7a501d 100644 --- a/schema_automator/utils/schemautils.py +++ b/schema_automator/utils/schemautils.py @@ -1,12 +1,34 @@ import copy import logging -from typing import Union +from typing import Union, Optional from deprecated.classic import deprecated import yaml from linkml_runtime.dumpers import yaml_dumper from linkml_runtime.linkml_model import SchemaDefinition +from linkml_runtime.utils.schema_as_dict import schema_as_dict + + +def write_schema(schema: Union[dict, SchemaDefinition], output: Optional[str]): + """ + Convenience method for writing a schema to stdout or to a file + + :param schema: + :param output: if None, then write to stdout + :return: + """ + if isinstance(schema, SchemaDefinition): + sdict = schema_as_dict(schema) + else: + sdict = schema + ys = yaml.safe_dump(sdict, sort_keys=False) + if output: + with open(output, 'w', encoding='UTF-8') as stream: + stream.write(ys) + else: + print(ys) + @deprecated("Replaced by linkml.runtime.utils.schema_as_dict") def minify_schema(obj: Union[dict, SchemaDefinition]) -> dict: @@ -27,8 +49,7 @@ def minify_schema(obj: Union[dict, SchemaDefinition]) -> dict: return obj - -# TODO: replace with schemaview +@deprecated("Replaced by schemaview") def merge_schemas(schemas, nomerge_enums_for=[]): schema = copy.deepcopy(schemas[0]) for s in schemas: diff --git a/tests/test_annotators/__init__.py b/tests/test_annotators/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_jsonld_annotator.py b/tests/test_annotators/test_jsonld_annotator.py similarity index 100% rename from tests/test_jsonld_annotator.py rename to tests/test_annotators/test_jsonld_annotator.py diff --git a/tests/test_schema_annotator.py b/tests/test_annotators/test_schema_annotator.py similarity index 94% rename from tests/test_schema_annotator.py rename to tests/test_annotators/test_schema_annotator.py index 9f0a793..6522057 100644 --- a/tests/test_schema_annotator.py +++ b/tests/test_annotators/test_schema_annotator.py @@ -10,7 +10,7 @@ from tests import INPUT_DIR, OUTPUT_DIR -KEYPATH = os.path.join('conf', 'bioportal_apikey.txt') +KEYPATH = os.path.join('../conf', 'bioportal_apikey.txt') class testAnnotator(unittest.TestCase): """NCBO """ diff --git a/tests/test_generalizers/__init__.py b/tests/test_generalizers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_from_tsv.py b/tests/test_generalizers/test_csv_data_generalizer.py similarity index 60% rename from tests/test_from_tsv.py rename to tests/test_generalizers/test_csv_data_generalizer.py index 0b3ce56..4af9887 100644 --- a/tests/test_from_tsv.py +++ b/tests/test_generalizers/test_csv_data_generalizer.py @@ -7,8 +7,10 @@ import yaml from linkml_runtime.linkml_model import SchemaDefinition -from schema_automator.importers.csv_import_engine import CsvDataImportEngine +from schema_automator.generalizers.csv_data_generalizer import CsvDataGeneralizer from linkml.generators.yamlgen import YAMLGenerator + +from schema_automator.utils.schemautils import write_schema from tests import INPUT_DIR, OUTPUT_DIR BOOKS = os.path.join(INPUT_DIR, 'books.tsv') @@ -18,18 +20,24 @@ NEWSLOTS = os.path.join(INPUT_DIR, 'data_to_import.tsv') NEWSLOTS_OUTSCHEMA = os.path.join(OUTPUT_DIR, 'new_slots.yaml') +EXPECTED_SLOTS = ['id', 'book_category', 'name', 'price', 'inStock', + 'author', 'series_t', 'sequence_i', 'genre_s', 'yesno', 'blah_b'] + -class TestTsvmport(unittest.TestCase): +class TestCsvDataGeneralizer(unittest.TestCase): """TSV import """ def test_tsv(self): """Test that TSVs can be imported to LinkML.""" - ie = CsvDataImportEngine() - schema_dict = ie.convert(BOOKS, class_name='Book', name='books') - ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) - with open(BOOKS_OUTSCHEMA, 'w') as stream: - stream.write(ys) - s = YAMLGenerator(ys).serialize() + ie = CsvDataGeneralizer() + schema = ie.convert(BOOKS, class_name='Book', schema_name='books') + self.assertEqual(schema.name, 'books') + self.assertEqual(list(schema.classes.keys()), ['Book']) + c = schema.classes['Book'] + self.assertCountEqual(EXPECTED_SLOTS, list(schema.slots.keys())) + self.assertCountEqual(EXPECTED_SLOTS, c.slots) + write_schema(schema, BOOKS_OUTSCHEMA) + s = YAMLGenerator(BOOKS_OUTSCHEMA).serialize() with open(BOOKS_OUTSCHEMA_ENHANCED, 'w') as stream: stream.write(s) @@ -37,22 +45,20 @@ def test_create_edge_slots(self): """ Test we can create slots with descriptions from a TSV file """ - ie = CsvDataImportEngine() + ie = CsvDataGeneralizer() schema_dict = ie.read_slot_tsv(NEWSLOTS, is_a="edge property") ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) with open(NEWSLOTS_OUTSCHEMA, 'w') as stream: stream.write(ys) def _convert(self, base_name: str, cn='Example', index_slot='examples') -> SchemaDefinition: - ie = CsvDataImportEngine() + ie = CsvDataGeneralizer() fn = f'{base_name}.tsv' infile = os.path.join(INPUT_DIR, fn) - schema_dict = ie.convert(infile, class_name=cn, name=index_slot) - ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) + schema = ie.convert(infile, class_name=cn, name=index_slot) outfile = os.path.join(OUTPUT_DIR, f'{base_name}.yaml') - with open(outfile, 'w') as stream: - stream.write(ys) - s = YAMLGenerator(ys).serialize() + write_schema(schema, outfile) + s = YAMLGenerator(outfile).serialize() outfile2 = os.path.join(OUTPUT_DIR, f'{base_name}.enhanced.yaml') with open(outfile2, 'w') as stream: stream.write(s) diff --git a/tests/test_fk_inference.py b/tests/test_generalizers/test_fk_inference.py similarity index 72% rename from tests/test_fk_inference.py rename to tests/test_generalizers/test_fk_inference.py index 92d802a..9cfd03e 100644 --- a/tests/test_fk_inference.py +++ b/tests/test_generalizers/test_fk_inference.py @@ -4,11 +4,11 @@ import logging import unittest import os -import yaml from linkml_runtime.utils.schemaview import SchemaView -from schema_automator.importers.csv_import_engine import CsvDataImportEngine -from linkml.generators.yamlgen import YAMLGenerator +from schema_automator.generalizers.csv_data_generalizer import CsvDataGeneralizer + +from schema_automator.utils.schemautils import write_schema from tests import INPUT_DIR, OUTPUT_DIR SAMPLES = os.path.join(INPUT_DIR, 'sample.tsv') @@ -21,7 +21,7 @@ class TestForeignKeyInference(unittest.TestCase): def test_fk_inference(self): """Test ability to infer foreign key linkages using sample data and ENVO.""" - ie = CsvDataImportEngine(downcase_header=True) + ie = CsvDataGeneralizer(downcase_header=True) fks = ie.infer_linkages([ENVO, SAMPLES]) #fks = ie.infer_linkages([SAMPLES, ENVO]) self.assertEqual(len(fks), 3) @@ -40,12 +40,13 @@ def test_fk_inference(self): def test_schema_with_fk_inference(self): """Tests foreign key inference.""" - ie = CsvDataImportEngine(downcase_header=True, infer_foreign_keys=True) - schema_dict = ie.convert_multiple([ENVO, SAMPLES]) - ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) - with open(SAMPLES_OUTSCHEMA, 'w') as stream: - stream.write(ys) - sv = SchemaView(ys) + ie = CsvDataGeneralizer(downcase_header=True, infer_foreign_keys=True) + schema = ie.convert_multiple([ENVO, SAMPLES]) + write_schema(schema, SAMPLES_OUTSCHEMA) + #ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) + #with open(SAMPLES_OUTSCHEMA, 'w') as stream: + # stream.write(ys) + sv = SchemaView(schema) expected = ['envo_biome_id', 'envo_feature_id', 'envo_material_id'] for sn in expected: s = sv.induced_slot(sn, 'sample') diff --git a/tests/test_from_robot_template.py b/tests/test_generalizers/test_from_robot_template.py similarity index 71% rename from tests/test_from_robot_template.py rename to tests/test_generalizers/test_from_robot_template.py index ee3d37a..7188ec4 100644 --- a/tests/test_from_robot_template.py +++ b/tests/test_generalizers/test_from_robot_template.py @@ -4,10 +4,11 @@ import unittest import os -import yaml -from schema_automator.importers.csv_import_engine import CsvDataImportEngine +from schema_automator.generalizers.csv_data_generalizer import CsvDataGeneralizer from linkml.generators.yamlgen import YAMLGenerator from linkml_runtime.utils.schemaview import SchemaView + +from schema_automator.utils.schemautils import write_schema from tests import INPUT_DIR, OUTPUT_DIR BIOBANK_SPECIMENS = os.path.join(INPUT_DIR, 'biobank-specimens.tsv') @@ -19,14 +20,11 @@ class TestRobotTemplateImport(unittest.TestCase): def test_from_robot_template(self): """Test that expando can be imported.""" - ie = CsvDataImportEngine(robot=True) - schema_dict = ie.convert(BIOBANK_SPECIMENS, class_name='BiobankSpecimen', name='biobank') - ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) - #print(ys) - with open(OUTSCHEMA, 'w') as stream: - stream.write(ys) + ie = CsvDataGeneralizer(robot=True) + schema = ie.convert(BIOBANK_SPECIMENS, class_name='BiobankSpecimen', name='biobank') + write_schema(schema, OUTSCHEMA) sv = SchemaView(OUTSCHEMA) - s = YAMLGenerator(ys).serialize() + s = YAMLGenerator(OUTSCHEMA).serialize() with open(OUTSCHEMA_ENHANCED, 'w') as stream: stream.write(s) for cn, c in sv.all_class().items(): diff --git a/tests/test_from_json.py b/tests/test_generalizers/test_json_data_generalizer.py similarity index 62% rename from tests/test_from_json.py rename to tests/test_generalizers/test_json_data_generalizer.py index 7650bd2..b3cbb42 100644 --- a/tests/test_from_json.py +++ b/tests/test_generalizers/test_json_data_generalizer.py @@ -4,11 +4,12 @@ import unittest import os -import yaml from linkml_runtime.utils.schemaview import SchemaView -from schema_automator.importers.json_instance_import_engine import JsonInstanceImportEngine +from schema_automator.generalizers.json_instance_generalizer import JsonDataGeneralizer from linkml.generators.yamlgen import YAMLGenerator + +from schema_automator.utils.schemautils import write_schema from tests import INPUT_DIR, OUTPUT_DIR IN = os.path.join(INPUT_DIR, 'synonymizer.yaml') @@ -18,35 +19,29 @@ OUTSCHEMA_GOLD = os.path.join(OUTPUT_DIR, 'neon-in-gold-inf.yaml') -class TestJsonImport(unittest.TestCase): +class TestJsonDataGeneralizer(unittest.TestCase): """JSON """ def test_from_json(self): """Test inference of a schema from JSON instance data (small example).""" - ie = JsonInstanceImportEngine() - schema_dict = ie.convert(IN, format='yaml') - ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) - print(ys) - with open(OUTSCHEMA, 'w') as stream: - stream.write(ys) - s = YAMLGenerator(ys).serialize() + ie = JsonDataGeneralizer() + schema = ie.convert(IN, format='yaml') + write_schema(schema, OUTSCHEMA) + s = YAMLGenerator(OUTSCHEMA).serialize() with open(OUTSCHEMA_ENHANCED, 'w') as stream: stream.write(s) - sv = SchemaView(ys) + sv = SchemaView(OUTSCHEMA) assert 'NewSynonym' in sv.get_enum(sv.induced_slot('type', 'Rules').range).permissible_values def test_gold_neon(self): """Test inference of a schema from JSON instance data (GOLD API example).""" - ie = JsonInstanceImportEngine() + ie = JsonDataGeneralizer() ie.omit_null = True BIOSAMPLE = 'Biosample' - schema_dict = ie.convert(IN_GOLD, format='json.gz', container_class_name=BIOSAMPLE) - ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) - print(ys) - with open(OUTSCHEMA_GOLD, 'w') as stream: - stream.write(ys) - sv = SchemaView(ys) + schema = ie.convert(IN_GOLD, format='json.gz', container_class_name=BIOSAMPLE) + write_schema(schema, OUTSCHEMA_GOLD) + sv = SchemaView(OUTSCHEMA_GOLD) assert BIOSAMPLE in sv.all_classes() habitat_slot = sv.induced_slot('habitat', BIOSAMPLE) assert 'Mixed forest soil' in sv.get_enum(habitat_slot.range).permissible_values diff --git a/tests/test_from_rdf.py b/tests/test_generalizers/test_rdf_data_generalizer.py similarity index 52% rename from tests/test_from_rdf.py rename to tests/test_generalizers/test_rdf_data_generalizer.py index 21cb162..3e28070 100644 --- a/tests/test_from_rdf.py +++ b/tests/test_generalizers/test_rdf_data_generalizer.py @@ -4,9 +4,10 @@ import unittest import os -import yaml -from schema_automator.importers.rdf_instance_import_engine import RdfInstanceImportEngine +from schema_automator.generalizers.rdf_data_generalizer import RdfDataGeneralizer from linkml.generators.yamlgen import YAMLGenerator + +from schema_automator.utils.schemautils import write_schema from tests import INPUT_DIR, OUTPUT_DIR PROV = os.path.join(INPUT_DIR, 'prov.ttl') @@ -14,20 +15,16 @@ OUTSCHEMA = os.path.join(OUTPUT_DIR, 'rdfs-from-prov.yaml') OUTSCHEMA_ENHANCED = os.path.join(OUTPUT_DIR, 'rdfs-from-prov.enhanced.yaml') -class TestRdfImport(unittest.TestCase): - """PROV """ +class TestRdfDataGeneralizer(unittest.TestCase): + """Tests generalization from RDF triples """ def test_from_rdf(self): - """Test that expando can be imported.""" - sie = RdfInstanceImportEngine() + sie = RdfDataGeneralizer() if not os.path.exists(DIR): os.makedirs(DIR) - schema_dict = sie.convert(PROV, dir=DIR, format='ttl') - ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) - print(ys) - with open(OUTSCHEMA, 'w') as stream: - stream.write(ys) - s = YAMLGenerator(ys).serialize() + schema = sie.convert(PROV, dir=DIR, format='ttl') + write_schema(schema, OUTSCHEMA) + s = YAMLGenerator(OUTSCHEMA).serialize() with open(OUTSCHEMA_ENHANCED, 'w') as stream: stream.write(s) diff --git a/tests/test_importers/__init__.py b/tests/test_importers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_convert_shacl.py b/tests/test_importers/test_convert_shacl_owl_representation.py similarity index 64% rename from tests/test_convert_shacl.py rename to tests/test_importers/test_convert_shacl_owl_representation.py index f8b5108..e7a183f 100644 --- a/tests/test_convert_shacl.py +++ b/tests/test_importers/test_convert_shacl_owl_representation.py @@ -7,6 +7,8 @@ import yaml from schema_automator.importers.owl_import_engine import OwlImportEngine from linkml.generators.yamlgen import YAMLGenerator + +from schema_automator.utils.schemautils import write_schema from tests import INPUT_DIR, OUTPUT_DIR SHACL = os.path.join(INPUT_DIR, 'shacl.ofn') @@ -14,19 +16,15 @@ OUTSCHEMA = os.path.join(OUTPUT_DIR, 'shacl-from-owl.yaml') OUTSCHEMA_ENHANCED = os.path.join(OUTPUT_DIR, 'shacl-from-owl-enhanced.yaml') -class TestOwlImport(unittest.TestCase): +class TestShaclOwlImport(unittest.TestCase): """Tests conversion of shacl metamodel (in OWL) to LinkML """ - def test_from_owl(self): - """Test OWL conversion.""" + def test_convert_shacl_owl(self): oie = OwlImportEngine() - schema_dict = oie.convert(SHACL, name='shacl') - ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) - #print(ys) - with open(OUTSCHEMA, 'w') as stream: - stream.write(ys) - s = YAMLGenerator(ys).serialize() + schema = oie.convert(SHACL, name='shacl') + write_schema(schema, OUTSCHEMA) + s = YAMLGenerator(OUTSCHEMA).serialize() with open(OUTSCHEMA_ENHANCED, 'w') as stream: stream.write(s) diff --git a/tests/test_dosdp.py b/tests/test_importers/test_dosdp_importer.py similarity index 97% rename from tests/test_dosdp.py rename to tests/test_importers/test_dosdp_importer.py index a6d40f7..09a058a 100644 --- a/tests/test_dosdp.py +++ b/tests/test_importers/test_dosdp_importer.py @@ -32,7 +32,7 @@ def load_dp(path) -> Pattern: del obj['def'] return yaml_loader.load(obj, target_class=Pattern) -class TestDOSDP(unittest.TestCase): +class TestDOSDPImporter(unittest.TestCase): """Tests import from DOSDP yaml templates """ def test_dosdp_import(self): diff --git a/tests/test_from_owl_schemaorg.py b/tests/test_importers/test_from_owl_schemaorg.py similarity index 100% rename from tests/test_from_owl_schemaorg.py rename to tests/test_importers/test_from_owl_schemaorg.py diff --git a/tests/test_from_jsonschema.py b/tests/test_importers/test_jsonschema_importer.py similarity index 98% rename from tests/test_from_jsonschema.py rename to tests/test_importers/test_jsonschema_importer.py index 912704a..d7c9392 100644 --- a/tests/test_from_jsonschema.py +++ b/tests/test_importers/test_jsonschema_importer.py @@ -21,7 +21,7 @@ PP = os.path.join(INPUT_DIR, 'phenopackets/phenopackets.schema.json') OUTSCHEMA = os.path.join(OUTPUT_DIR, 'phenopackets.yaml') -class TestJsonSchemaImport(unittest.TestCase): +class TestJsonSchemaImporter(unittest.TestCase): """JSONSchema """ def _convert(self, fn, suffix='json', path='jsonschema', name=None, root_class_name=None, data_files=[], target_class=None): diff --git a/tests/test_from_owl.py b/tests/test_importers/test_owl_importer.py similarity index 69% rename from tests/test_from_owl.py rename to tests/test_importers/test_owl_importer.py index e41dd1a..d6e392a 100644 --- a/tests/test_from_owl.py +++ b/tests/test_importers/test_owl_importer.py @@ -7,6 +7,8 @@ import yaml from schema_automator.importers.owl_import_engine import OwlImportEngine from linkml.generators.yamlgen import YAMLGenerator + +from schema_automator.utils.schemautils import write_schema from tests import INPUT_DIR, OUTPUT_DIR PROV = os.path.join(INPUT_DIR, 'prov.ofn') @@ -14,18 +16,15 @@ OUTSCHEMA = os.path.join(OUTPUT_DIR, 'prov-from-owl.yaml') OUTSCHEMA_ENHANCED = os.path.join(OUTPUT_DIR, 'prov-from-owl.enhanced.yaml') -class TestOwlImport(unittest.TestCase): +class TestOwlImporter(unittest.TestCase): """PROV """ def test_from_owl(self): """Test OWL conversion.""" oie = OwlImportEngine() - schema_dict = oie.convert(PROV, name='prov') - ys = yaml.dump(schema_dict, default_flow_style=False, sort_keys=False) - #print(ys) - with open(OUTSCHEMA, 'w') as stream: - stream.write(ys) - s = YAMLGenerator(ys).serialize() + schema = oie.convert(PROV, name='prov') + write_schema(schema, OUTSCHEMA) + s = YAMLGenerator(OUTSCHEMA).serialize() with open(OUTSCHEMA_ENHANCED, 'w') as stream: stream.write(s) diff --git a/tests/test_sparql_import.py b/tests/test_sparql_import.py deleted file mode 100644 index bef949a..0000000 --- a/tests/test_sparql_import.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- - -"""Test the module can be imported.""" - -import unittest - - -class TestImport(unittest.TestCase): - """A test case for import tests.""" - - def test_sparql(self): - """Test that expando can be imported.""" diff --git a/tests/test_utils/__init__.py b/tests/test_utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_utils/test_instance_extractor.py b/tests/test_utils/test_instance_extractor.py new file mode 100644 index 0000000..5b57939 --- /dev/null +++ b/tests/test_utils/test_instance_extractor.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +"""Test the module can be imported.""" + +import unittest +import os +from linkml_runtime.linkml_model import SchemaDefinition, ClassDefinition +from linkml_runtime.loaders import yaml_loader +from linkml_runtime.utils.introspection import package_schemaview +from linkml_runtime.dumpers import yaml_dumper +from schema_automator.utils.instance_extractor import InstanceView +from tests import INPUT_DIR, OUTPUT_DIR + +SCHEMA = os.path.join(INPUT_DIR, 'kitchen_sink.yaml') + +class TestInstanceExtractor(unittest.TestCase): + """ + Tests instance extraction + """ + + def setUp(self) -> None: + root: SchemaDefinition + self.root = yaml_loader.loads(SCHEMA, SchemaDefinition) + meta_sv = package_schemaview('linkml_runtime.linkml_model.meta') + self.iv = InstanceView(root=self.root, schemaview=meta_sv) + self.iv.create_index() + + def test_index(self): + iv = self.iv + id_to_path = iv.id_to_path + #for k, v in id_to_path.items(): + # print(f'{k} = {v}') + self.assertEqual(['slots', 'has employment history'], id_to_path['has employment history']) + #self.assertEqual(['slots', 'id'], id_to_path['id']) + self.assertNotIn('id', id_to_path) ## imports not resolved by default + self.assertEqual(['enums', 'EmploymentEventType'], id_to_path['EmploymentEventType']) + obj = iv.fetch_object('Person') + #print(obj) + self.assertEqual(type(obj), ClassDefinition) + self.assertEqual(obj.id_prefixes, ['P']) + #for s, o in iv.references: + # if s is not None: + # print(f'T={s.name} -- {o}') + + def test_extract(self): + ie = self.iv + #refs = ie.get_object_references(root.classes['Concept'], 'class_definition') + #print(refs) + #self.assertCountEqual(['id', 'name', 'in code system', 'Concept'], refs) + c = ie.fetch_object('DiagnosisConcept') + print(c) + refs = ie.get_object_references(c) + print(refs) + self.assertCountEqual(['in code system', 'DiagnosisConcept', 'Concept', 'CodeSystem', 'name', 'id'], refs) + subschema = ie.extract(['MedicalEvent']) + #print(yaml_dumper.dumps(subschema)) + self.assertIn('Concept', subschema.classes) + self.assertIn('Event', subschema.classes) + self.assertIn('diagnosis', subschema.slots) + self.assertNotIn('Person', subschema.classes) + subschema = ie.extract(['FamilialRelationship']) + self.assertIn('Event', subschema.classes) + self.assertIn('FamilialRelationshipType', subschema.enums) + self.assertIn('diagnosis', subschema.slots) + subschema = ie.extract(['employed at']) + print(yaml_dumper.dumps(subschema)) + self.assertIn('Event', subschema.classes) + self.assertIn('FamilialRelationshipType', subschema.enums) + self.assertIn('diagnosis', subschema.slots) + + + From 5f9b2c501a8d39e3f0eb4c4ea3205ab59b7b6a1d Mon Sep 17 00:00:00 2001 From: cmungall Date: Thu, 9 Jun 2022 10:26:10 -0700 Subject: [PATCH 2/2] add missing --- .gitignore | 5 + tests/resources/kitchen_sink.yaml | 341 ++++++++++++++++++++++++++++++ 2 files changed, 346 insertions(+) create mode 100644 tests/resources/kitchen_sink.yaml diff --git a/.gitignore b/.gitignore index 8c8e5a8..b17b968 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,10 @@ +.idea +.ipynb_checkpoints/ +docs/_build/ wwwroot/*.js node_modules typings dist schema_automator.egg-info/* +tmp/ +__pycache__ diff --git a/tests/resources/kitchen_sink.yaml b/tests/resources/kitchen_sink.yaml new file mode 100644 index 0000000..6017bcc --- /dev/null +++ b/tests/resources/kitchen_sink.yaml @@ -0,0 +1,341 @@ +id: https://w3id.org/linkml/tests/kitchen_sink +name: kitchen_sink +description: |- + Kitchen Sink Schema + + This schema does not do anything useful. It exists to test all features of linkml. + + This particular text field exists to demonstrate markdown within a text field: + + Lists: + + * a + * b + * c + + And links, e.g to [Person](Person.md) + +default_curi_maps: + - semweb_context +imports: + - linkml:types + - core +prefixes: + pav: http://purl.org/pav/ + dce: http://purl.org/dc/elements/1.1/ + lego: http://geneontology.org/lego/ + linkml: https://w3id.org/linkml/ + biolink: https://w3id.org/biolink/ + ks: https://w3id.org/linkml/tests/kitchen_sink/ + RO: http://purl.obolibrary.org/obo/RO_ + BFO: http://purl.obolibrary.org/obo/BFO_ + CODE: http://example.org/code/ + ROR: http://example.org/ror/ + A: http://example.org/activities/ + P: http://example.org/person/ + skos: http://www.w3.org/2004/02/skos/core# + bizcodes: https://example.org/bizcodes/ + schema: http://schema.org/ +default_prefix: ks +see_also: + - https://example.org/ + +subsets: + + subset A: + description: >- + test subset A + comments: + - this subset is meaningless, it is just here for testing + aliases: + - A + subset B: + description: >- + test subset B + aliases: + - B + +classes: + + HasAliases: + mixin: true + attributes: + aliases: + slot_uri: skos:altLabel + multivalued: true + + Friend: + abstract: true + slots: + - name + + Person: + description: A person, living or dead + in_subset: + - subset A + mixins: + - HasAliases + slots: + - id + - name + - has employment history + - has familial relationships + - has medical history + - age in years + - addresses + - has birth event + slot_usage: + name: + pattern: "^\\S+ \\S+" ## do not do this in a real schema, people have all kinds of names + id_prefixes: + - P + exact_mappings: + - schema:Person + + Organization: + mixins: + - HasAliases + slots: + - id + - name + id_prefixes: + - ROR + + + Place: + mixins: + - HasAliases + slots: + - id + - name + Address: + slots: + - street + - city + + Concept: + slots: + - id + - name + - in code system + id_prefixes: + - CODE + + DiagnosisConcept: + is_a: Concept + close_mappings: + - biolink:Disease + + ProcedureConcept: + is_a: Concept + + Event: + slots: + - started at time + - ended at time + - is current + - metadata + + Relationship: + slots: + - started at time + - ended at time + - related to + - type + + FamilialRelationship: + is_a: Relationship + slot_usage: + type: + range: FamilialRelationshipType + required: true + related to: + range: Person + required: true + + BirthEvent: + is_a: Event + slots: + - in location + + EmploymentEvent: + is_a: Event + slots: + - employed at + - type + slot_usage: + type: + range: EmploymentEventType + required: false + + MedicalEvent: + is_a: Event + slots: + - in location + - diagnosis + - procedure + + WithLocation: + mixin: true + slots: + - in location + + MarriageEvent: + is_a: Event + mixins: + - WithLocation + slots: + - married to + + Company: + is_a: Organization + attributes: + ceo: + range: Person + slot_uri: schema:ceo + ## TODO - schemaview requires all attributes to have explicit uri otherwise slot_uri fails + + CodeSystem: + slots: + - id + - name + + Dataset: + tree_root: true + attributes: + persons: + range: Person + inlined: true + inlined_as_list: true + multivalued: true + companies: + range: Company + inlined_as_list: true + inlined: true + multivalued: true + activities: + range: activity + inlined_as_list: true + inlined: true + multivalued: true + code systems: + range: CodeSystem + inlined: true + multivalued: true + + FakeClass: + deprecated: this is not a real class, we are using it to test deprecation + attributes: + test_attribute: + + class with spaces: + attributes: + slot with space 1: + subclass test: + is_a: class with spaces + attributes: + slot with space 2: + range: class with spaces + + + AnyObject: + class_uri: linkml:Any + description: Example of unconstrained class + +slots: + employed at: + range: Company + in_subset: + - subset A + is current: + range: boolean + has employment history: + range: EmploymentEvent + multivalued: true + inlined_as_list: true + in_subset: + - subset B + has marriage history: + range: MarriageEvent + multivalued: true + inlined_as_list: true + in_subset: + - subset B + has medical history: + range: MedicalEvent + multivalued: true + inlined_as_list: true + in_subset: + - subset B + has familial relationships: + range: FamilialRelationship + multivalued: true + inlined_as_list: true + in_subset: + - subset B + married to: + range: Person + in location: + range: Place + annotations: + "biolink:opposite": location_of + diagnosis: + range: DiagnosisConcept + inlined: true + procedure: + range: ProcedureConcept + inlined: true + addresses: + range: Address + multivalued: True + age in years: + description: number of years since birth + range: integer + minimum_value: 0 + maximum_value: 999 + in_subset: + - subset A + - subset B + related to: + type: + street: + city: + has birth event: + range: BirthEvent + in code system: + range: CodeSystem + metadata: + range: AnyObject + description: Example of a slot that has an unconstrained range + +enums: + FamilialRelationshipType: + permissible_values: + SIBLING_OF: + PARENT_OF: + CHILD_OF: + DiagnosisType: + permissible_values: + TODO: + EmploymentEventType: + description: codes for different kinds of employment/HR related events + aliases: + - HR code + permissible_values: + HIRE: + meaning: bizcodes:001 + description: event for a new employee + FIRE: + meaning: bizcodes:002 + annotations: + "biolink:opposite": HIRE + PROMOTION: + meaning: bizcodes:003 + description: promotion event + TRANSFER: + meaning: bizcodes:004 + description: transfer internally + other codes: + permissible_values: + a b: + #1+2: \ No newline at end of file